①SQLの本を読んでいたら、メモリについての書いてあったのですが、「データが大きくなった場合は、全部メモリに読み込んで処理するのではなくて分散して処理する必要がある」ということが書いてありました。メモリやCPUの処理の分散について知りたいのですが、具体的にこんなコードで処理を分散するこんな関数でCPUを使用率を調べるなど、具体的なコードが書いてある本、ページを教えてください。Perl勉強中なのでPerlがよいですが、難しくなければ他の言語でもいいです。

②また、qmailでメールを一斉送信する場合のサーバの負荷を調べて、送信の量を制御する方法も簡単にご説明をお願いします。
※プログラミング初心者です。
※①、②どちらか片方だけの回答でもかまいません。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2006/05/01 05:29:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:inosisibeyan No.1

回答回数211ベストアンサー獲得回数0

◯1コマンドラインならtopというコマンドで、現在のCPU・メモリの使用状況が数秒単位で表示されます。

私の経験では、メモリの上で実行出来る限界までなら何の工夫もいらないので、データを最適化や正規化をやって一つ一つのデータを小さくするのが早道です。

どうしても、データの大きいままで実行しなければならなくなってからメモリの上でやるかどうか考えるといいと思います。

メモリ上でデータベースを実行するコマンドはありますが、逆はデフォルトではHDD上でデータを持ったまま実行しています。

最も使用頻度の高いデータのみをメモリ上に展開して、使用するというのが一般的なやり方のように思います。

http://marijuana.ddo.jp/xoops/modules/newbb/viewtopic.php?to...

データベースの実行時間の計算の目安としては、テーブルの容量を掛け合わしただけの時間がかかる物なので、出来るだけ容量を減らしてから実行するのが基本と思います。

キャッシュや、バッファの容量を変更するなどや回りのアプリケーションとの関連も有りますので、総合的に判断する必要がありますが、分からないときにはMySQLの各種confをコピーして使うのも一つの手です。

これは一例ですが、以下のようなconfが私のPCには上がっておりました。参考まで

/usr/share/doc/mysql-server-5.0.18/my-huge.cnf
/usr/share/doc/mysql-server-5.0.18/my-innodb-heavy-4G.cnf
/usr/share/doc/mysql-server-5.0.18/my-large.cnf
/usr/share/doc/mysql-server-5.0.18/my-medium.cnf
/usr/share/doc/mysql-server-5.0.18/my-small.cnf

id:rain2003

ありがとうございます。ちょうどMySQL使ってました。初心者といってもほんとにプログラミングやパソコンの仕組み勉強始めたばかりだったので、難しかったのですが何とかわかりました。topはlinuxのコマンドでMySQLのサーバのお話ということでよろしかったでしょうか。cnfはサーバの設定ファイルのようですね。

説明不足と私の文章がおかしかったようです。申し訳ございません。以下、加筆をさせてください。

本に書いてあることですが、掲示板のスクリプトのコーナーでした。fetchall_arrayrefで結果を全部メモリに溜め込むという話です。データが大きい場合はメモリ不足を起こすことがあって、読者の宿題にするということでした。例えば、スクリプト側でどういったふうに書いて負荷の情報を取得して、分散させるのかを知りたいです。それとも負荷のあることを予想して書くのでしょうか。そこで、同じようにスクリプト側で、CPUの負担などについても管理する例がないかとふとおもいまして、qmailについてもスクリプト側で負荷情報を取得して、ペースを調節したりできるのかあわせて質問させていただきました。

例えば、レンタルサーバで、CGIを動かすときなどCPUやメモリなど考えなくても大丈夫なのでしょうか。サーバ側で、メモリ不足のときの処理など自動で分散してくれるのでしょうか。

よろしくお願いします。

[追記]自分でも調べているところですが、qmailはメモリ、CPUではなく通信状況を調べることになるんでしょうか。

2006/04/24 23:40:56
  • id:rain2003
    解決できなかったのでまた違う機会に質問させてください。
  • id:bonlife
    BLOB型を使ってバイナリデータをやり取りするような場合にはメモリ使用量を気にする必要があると思いますが、テキストデータのみであれば、それほを心配する必要はないと思います。
    例えば、掲示板で1回の投稿に1,000文字(2,000byte)まで記入できる場合、メッセージ以外の部分の情報を含めたとして1件あたり最高で2,500byte程度になります。
    メモリをどれくらい使えるのか、ということにもよりますが、1件が2,500byte程度であれば8MBのメモリ上に3,000件ぐらいの情報は保持できることになります。
    掲示板などの場合、通常は1ページに全ての情報を保持させるわけではなく、「最新の10件のみ表示させる」などの表示をさせますよね。
    ここにスクリプトでの工夫があります。
    表示処理にて、メッセージ番号、あるいは投稿日時などをWHERE句での検索のキーにして、DBから取得する情報を制限します。
    その結果、実際に1ページ表示させるためにDBとのやりとりで展開されるメモリは、2,500byte*10件で25KB程度になります。
    まとめると、投稿のサイズに制限をかけ、1件が最高でどの程度のサイズになるのかを事前に把握しておき、1ページの表示の件数を制御することで、DBとのやり取りで使うことになるメモリサイズを事前に見積もっておくことが重要、ということになると思います。
    (ただし、上記の例では、ソート処理で使われるDBのプロセスのメモリ使用量は考慮できておりません。)
    レンタルサーバでは、ulimit(あるいはlimit)などでプロセスのメモリ上限を設定している場合があります。
    その場合、その制限量を超えるような処理を行おうとした場合、メモリの割り当てが出来ずにエラーになります。
    (その他の方法でサーバ側で制限をかけていることもあります。)
    qmailについては詳しくないのですが、添付ファイルを許可してしまうと、そのファイルをユーザの数だけコピーすることになるため、CPU負荷もネットワーク負荷も高くなると思います。
    (正確な情報ではないかもしれません。ご了承ください。)
    参考になれば幸いです。
  • id:rain2003
    コメントなのに詳しく書いていただきありがとうございます。
    一文字2byteとかそういうこと全然考えたこと無いのでとても勉強になりました。

    話が変わってしまいますが、前回の検索の件でアドバイスをいただいたMySQLの項目別や検索の件できました!
    正規表現って自分で書いたものでも一日経つと目がチカチカします。

    >表示処理にて、メッセージ番号、あるいは投稿日時などをWHERE句
    >での検索のキーにして、DBから取得する情報を制限します。
    実は、ページ別の表示ちょうど作ってみたところでした。
    エクセルのように行を削除すると詰めてくれないようなので、データが番号順になっていないので直感的にわかりにくかったのですが、SELECTするときに、毎回記事番号でソートして作りました。
    ①記事番号だけでソートしたものをSELECTして記事数を取得
    ②スクリプトで1ページあたりの表示数から、ページ数や事項のn,mを計算(ページの最大、最小が上から何番目か)
    ③noフィールドの表示させるページの最大、最小の番号を取得
    $first = $res->[$n][0]; #はじめのn番目の記事番号
    $last = $res->[$m][0]; #はじめのm番目の記事番号
    ・WHERW no <= $first AND no <= $last
    でSELECT * で1ページ分ということで処理しました。
    おかげさまで、徐々にですが思ったことが書けるようになってきました。

    気持ちは、いるか賞です。
    本当にありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません