Postgresqlののサーバでpgbenchを実行しています。
その時、cpu使用率が50%程度で、cpu割り込みも発生せず、ioの値も5いくかどうかで推移しています。
メモリ使用率においても20%弱で推移して、swapも使用されていません
このような状態の時、OSはマルチタスクを実行するためにプロセスの切替が間に合っていない状態のようですが、
Load Averageを低減させる手段としてどのような対処方法がありますでしょうか
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
サーバーのボトルネック切り分けは、かなり奥深い問題なので、ご提示頂いた情報だけでは何とも言えません・・・
一般論からすると以下のページの説明が簡潔で分かりやすいです。
[システムの負荷の原因を切り分ける方法](http://qiita.com/k0kubun/items/8ab1dfa7c0359d8e618d)
TaichiYanagiya さんもご回答頂いているように、Disk I/O がボトルネックになっている可能性も高いです。これはDBのベンチマークという目的からすると、むしろ当然かもしれません。
また、最近では メニーCPU/メニーコア が当たり前の時代となりましたが、もし稼働しているプロセスが未対応だと 1CPU/コア のみしか利用されないので、たとえば4コアの場合、CPU使用率が 25% で頭打ちになってしまいます。これは、対応が未済みというよりも、処理の内容によっては メニーCPU/メニーコア 対応が難しいという場合もあります。
このような場合、見かけ上のCPU使用率は低いとしても、実質的にはCPUの処理能力がボトルネックになっていることになります。
いずれにしても、何がボトルネックになっているのかを、もっと綿密に調査・切り分けしないと、具体的な対策は決められません。たとえば linux ボトルネック 調査
のようなキーワードでググると色々な調査・分析方法が紹介されていますので、もう少し踏み込んで調査されることをオススメいたします。ご参考までに以下のページのリンクを貼り付けておきます。
sarによるボトルネック発見の手順(というかsysstatの使用法)をまとめてみた
さて、ようやくここから本論ですが、
Load Averageを低減させる手段としてどのような対処方法がありますでしょうか
ボトルネックが分かれば具体的な対策の検討に入る訳ですが、実は「Load Average」が高いこと自体がいけない訳でもありません。
まず、「Load Average」については下記ページが詳しいですが
Linux のロードアベレージは「ロードアベレージは過去1分、5分、15分の間の実行待ちプロセス数の平均数 = 実行したくても他のプロセスが実行中で実行できないプロセスが平均で何個ぐらい存在してるか」を示す値です。
サーバーで実行されるプロセスの中には、目的によって以下のように幾つかに分類されます。
0. それ自体は軽い処理だが、なるべくたくさんのプロセスを短時間に処理したいもの
0. それ自体が重い処理で、なるべく早く処理を完了したいもの
0. 重たい処理だが急がないので、バックグラウンドでゆっくり処理をすれば良いのも
重たい処理を同時にたくさん実行しようとすると、サーバー全体の応答が極端に悪くなってしまうのですが、3. のように重いけれども急がないプロセスは プロセスの優先度を下げる 事によって、サーバー全体の応答性を損なうこと無く同時に多数のプロセスを稼働させることが可能です。
具体的には、nice(renice)コマンドやioniceコマンドを使用することで、プロセスの優先度を調整します。
Linux の nice / renice コマンドを覚えた
このようにすると、サーバー全体の応答性をあまり犠牲にすることなく大量のプロセスを稼働させる(つまり、急がないプロセスは優先度を下げて稼働させておき、サーバーリソースに空きのできた時にちょっとずつ処理を進める)ことも可能なのですが、そうすると たくさんのプロセスがキューに溜まっている状態 になるため Load Average の高い状態が続く事になります。
しかし、これは意図的に作り出している状況であり、サーバー全体の稼働状況に問題はない訳です。
一方、重たい処理だが、それ自体をなるべく早く完了させたい という場合は、そのプロセス自体のボトルネックを特定して対策を講じる必要があります。
この場合は自プロセスの内部の問題なので、やはり Load Average の大きさは直接関係ありません。
たくさんのプロセスがキューに溜まっていても、自プロセスの実行優先度を高くすると優先的に処理されるようになるため、自分自身は長い時間順番待ちすること無く処理が進みます。
とはいえ、もともと重たい処理なので、単純に優先度を上げただけではやはり処理の完了までに長い時間が掛かってしまいます。
ですので、必要に応じて以下の対策を組み合わせて実施します。
1)サーバー自体のリソースを増強する(スケールアップ)
- CPU(コア)を増やす
- メモリーの搭載量を増やす
- 外部ストレージを高速なものに交換する、RAMディスクを活用する
- ネットワーク機器を高速なものに交換する
2)サーバーやストレージを複数用意し負荷分散する(スケールアウト)
3)OS(カーネルパラメータ)を調整してサーバーリソースをもっと効率的に利用できるようにする
4)プロセス自体を改善して負荷を下げる
これら一つ一つについて書き出すと、ポイントを箇条書きにするだけでも膨大な量になってしまうので、ボトルネックを特定し具体的な対策の「方針」が決まった時点で、必要に応じて再度ご質問ください。
《追記:2015/12/08 14:00》
PostgreSQLのMax_connection数を現行の100から少しでも上げる必要がある事から
との事ですが、そうであればやはりロードアベレージは直接的には関係ないですね。
そして、この チューニングの目的 こそ、質問の最初に伝えるべきものです。
接続数を増やす最大のカギは Postgres 自体のパラメーター調整ですが、やはりただ闇雲に変更すれば良いでは無いです。既に色々調整済みとの事ですからご承知だろうとは思いますが、一応、下記ページを振り返って設定値を見直してみてください。
PostgreSQLのチューニング事例
PostgreSQLのチューニング その1
その上で、もしOS側のTCP同時接続数の上限がボトルネックになっているならばカーネルパラメーターを調整します。
net.core.somaxconnについて調べてみた
関連するパラメーターは他にもあるので、必要なら追加で調べるか質問してください。
その上で更なる改善が必要ならば、pgpool の導入を検討されると良いかもしれません。
PostgreSQLには絶対!pgpool-II
古い情報が多くて恐縮ですが、ご参考になれば幸いです。
投稿2015/12/03 21:03
編集2015/12/08 05:00総合スコア5936
0
Load Average は CPU負荷の他、ディスクI/O、(短時間での)プロセス生成が関わってきます。
pgbench 実行とのことですので、ディスクI/O、特に書き込み待ちが多くなっていると推測されます。
vmstat 5
で 5秒ごとの cpu wa の値が大きくなっていませんでしょうか?
ディスクへの書き込み待ちを低減するためには、速いストレージを使うとか、そもそも書き込むデータを少なくするとか、くらいでしょうか。
(2015/12/04 09:08 追記)
データベースであれば、I/Oスケジューラーを noop や deadline に変えると性能が上がるかもしれません。
設定方法は、kernel 起動パラメータで elevator=noop とするか、echo noop > /sys/block/sda/queue/scheduler
(sda 箇所は環境に合わせて)。
pi-chan さんの回答のとおり、Load Average の値が高いこと自体は問題ないと思います。
投稿2015/12/03 14:56
編集2015/12/04 00:09総合スコア12146
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/05 00:26
2015/12/06 02:40
0
他の方の回答で出尽くした感がありますが、一応以下も確認してみてください。
mpstat
: コアごとの状況は偏っていないか、%irq
、%soft
はどうかcat /proc/interrupt
: 特定コアへの割り込み数が毎秒数十万単位になっていないか
idleがありながらのLoad Averageの異常な上昇は、割り込み不可能なタスクがたまっている証拠です。そのうちブロックデバイスの場合はiowaitに計上されますが、キャラクターデバイスやネットワークはiowaitに計上されません、というかできません。アフィニティを設定していないのにcpuがidleしていて、iowaitも低いとなると、候補はネットワークと・・あと何かありますか?
コア数8に対して、Load値が30といういうのも、各コアに平均3.75のタスクがたまっているとは考えずらいです(それならiowaitなりuserなりの値がもっと上昇します)。アフィニティが設定された1つのコアに30近いタスクが溜まってると考えた方が自然です。そしてアフィニティが最初から設定されているもので一番可能性が高いのがネットワークのPCI割り込みです。
ただ、ネットワークIOの割り込みを各コアに分散させるのは必ずしも良いことではないので、よく前例などを調べてから行ってください。
Red Hat Enterprise Linux 4.3. 割り込みおよび IRQ チューニング
あと、そもそもですが、同時接続200でフルロードというのは、実際に運用したときにはどの程度のユーザーベースなのか検討が必要ではないでしょうか(F5攻撃でも無い限り、200ユーザーではないでしょう)。そのユーザーベースを支えるために別の部分がボトルネックになるのなら、DBの負荷よりもそちらを先にやるべきです。
投稿2015/12/07 03:50
総合スコア1149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/05 01:17
2015/12/05 06:53
2015/12/07 01:54
2015/12/07 03:53
2015/12/08 02:25
2015/12/08 04:07
2015/12/09 02:26
2016/08/18 02:01