データ収集サーバーのCPU負荷が高い

データ収集サーバーのCPU負荷が高い

Websocket 接続を使用して API からデータを取得し、それを postgresql データベースに書き込む小さな Python プログラムをセットアップしました。

実行されている (ユーザー) プログラムは 2 つだけです。データを受信して​​データベースに書き込む Websocket 接続と、15 秒ごとに実行され、データが書き込まれているかどうかを確認する基本的な while ループである別のプログラムです。

両方のプログラムはスーパーバイザによってデーモン化されており、15 秒間データが書き込まれない場合、スーパーバイザが再起動されます (デッド Websocket 接続を処理するため)。

また、私は(非常に)怠け者だったので、psycopg2 を直接使用する代わりに、Django ORM を使用して DB 接続を実行しました。

動作しますが、サーバーの CPU 負荷が常に高くなっています。これは 1CPU 1Gb メモリ サーバー (AWS micro) です。top コマンドの出力は次のようになります。

top - 17:10:58 up 19 days, 15:03,  1 user,  load average: 1,57, 1,63,    1,58
Tasks: 116 total,   1 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0,3 us,  0,3 sy,  0,0 ni,  0,0 id, 99,0 wa,  0,0 hi,  0,0 si,  0,3 st
 KiB Mem :  1014552 total,    63440 free,    86572 used,   864540 buff/cache
 KiB Swap:  1048572 total,   987380 free,    61192 used.   615096 avail Mem

まあ、システムは遅くて時々クラッシュします。

これは、高い IO 負荷 (99 wa) が原因であることがわかります。スリープ状態のプロセスが多数あります。ただし、データベースにのみ 1 日あたり平均 400 MB を書き込みます。

ドキュメントに従って書き込み負荷が高い場合に Postgresql 構成を変更し、スワップ メモリ ファイル (1 GB) を設定してみましたが、負荷平均の緩和には役立ちませんでした。

したがって、私のような経験の浅いユーザーにとっては、これが予想すべき負荷かどうかはわかりません。この設定を最適化できますか? Django ORM を削除し、psycopg2 のみを使用してプログラムを作成した場合、改善されますか? デッド Websocket 接続の別のチェック方法を作成する必要がありますか? このようなニーズに合わせて最適化できるサーバー構成はありますか?

ありがとう!

答え1

このリンクを使用して修正する方法を見つけましたhttp://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

基本的に、実行してiotop、どのプロセスが高 IO 負荷を引き起こしているかを出力しました。そこで、負荷の原因はデータベースの読み取りであり、書き込みではないことがわかりました。そこで、自分が愚かなことをしていたことに気付きました。記録しているかどうかを確認しながらエントリ数をカウントすることで、データベース全体を頻繁にクエリしていました。平均 500MB/s の読み取りでした。そこで、エントリをカウントするのではなく、最後のエントリのプライマリ キー番号をチェックするようにコードを変更しました。これでうまくいきました。負荷平均は現在 0.01 です。@match さん、アドバイスをありがとうございました。

関連情報