2020年04月

muninがPostgreSQLから情報をとれなくなるほど負荷があがる

ここ1ヶ月ほどmuninがPostgreSQLから情報をとれなくなるほど負荷があがることが1日に1,2回程度発生していました。
以下の赤い四角で囲った部分です。
グラフがぽっかり抜けています。
001
スロークエリがあると想定してログを取得するも、問題となるようなクエリはありませんでした。
実行に時間がかかっているクエリはたくさんあったのですが、いずれのクエリも平常時はms単位で応答を返すものでした。
が、この事象が発生するときは、応答に5秒かかる…というような状態でした。
sarを実行すると以下のような出力が得られました。

06時40分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
06時41分01秒     all      7.36      2.01      3.00      0.58      0.00     87.05
06時42分01秒     all      4.46      0.00      1.79      0.32      0.00     93.43
06時43分01秒     all      4.87      0.00      1.55      0.43      0.00     93.15
06時44分01秒     all      6.98      0.00      2.56      0.26      0.00     90.19
06時45分01秒     all     13.59      0.00      5.06      0.24      0.00     81.11
06時46分01秒     all     45.36      1.99     17.29      0.30      0.00     35.06
06時47分01秒     all     74.13      0.00     25.38      0.00      0.00      0.49
06時48分01秒     all     74.97      0.00     24.87      0.00      0.00      0.16
06時49分02秒     all     76.15      0.00     23.46      0.00      0.00      0.39
06時50分01秒     all     44.06      0.00     14.09      0.08      0.00     41.77
06時51分01秒     all     14.55      1.98      5.38      0.90      0.00     77.19
06時52分01秒     all      9.73      0.00      2.82      0.31      0.00     87.14
※sarはCentOSの場合、デフォルトでは10分に1回記録するようになっていますが、10分だと問題が発生したときにログを見るのがつらいので1分に変更すべきだと思います。ちなみに、この問題が発生したとき、DBサーバーは10分間隔だったで…1分に変更しました。

userとsystemでCPU時間を100%使いつくしている状態です。
負荷が高いのはPostgreSQLを動かしているサーバーで、Apacheを動かしているサーバーの負荷は問題ありませんでした。
以上から、PostgreSQLでなにか起こっているに違いないと思って、いろいろ切り分けたのですが、PostgreSQLのログを見ても何もわかりませんでした。

何か多くのアクセスがきているのが原因かもしれないと思い、Apacheのログを見たのですが、何かが起こっている06時46分と何も起こってない時間のアクセス数はあまりかわらず、多くのアクセスがきているわけではなさそうでした。

アクセス数はかわらないのですが、どこからアクセスがきているのか?を集計したところ、bingbotが多くをしめていました。
bingbotにしぼって06時45分のログを見たのが以下です。
207.46.13.34	[30/Apr/2020:06:45:27+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=6151 HTTP/1.1	200	49991
40.77.167.157	[30/Apr/2020:06:45:30+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=19208 HTTP/1.1	200	51751
40.77.167.157	[30/Apr/2020:06:45:22+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=2830 HTTP/1.1	200	50266
207.46.13.34	[30/Apr/2020:06:45:22+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=9955 HTTP/1.1	200	51289
40.77.167.157	[30/Apr/2020:06:45:24+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=2041 HTTP/1.1	200	50478
40.77.167.186	[30/Apr/2020:06:45:39+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=21480 HTTP/1.1	504	247
40.77.167.186	[30/Apr/2020:06:45:39+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=20671 HTTP/1.1	504	247
40.77.167.186	[30/Apr/2020:06:45:39+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=20632 HTTP/1.1	504	247
207.46.13.34	[30/Apr/2020:06:45:43+0900] GET /~ap2/ero/toukei_kaiseki/soukan.php?game=16545 HTTP/1.1	504	247
soukan.phpにそこそこな頻度でアクセスした結果、504を返しています。
soukan.phpはあるゲームに似た評価をされているゲームを表示するスクリプトです。
このスクリプトは作りが悪くて…SQLを1万回程度実行するスクリプトです。
SQL自体は0.006秒程度で応答を返すのですが、それを1万回実行するので…応答がかえるまでに60秒程度かかります。
実行に60秒程度かかるスクリプトをだいたい5秒おきに実行されてしまったので負荷が高くなったようでした。

自分は、DBのネックで負荷があがる場合は、iowaitが高くなると思い込んでいたのですが、1つのスクリプトで応答時間は短いけどSQLを大量に発行して処理が追いつかなくなる場合は、userやsystemが高くなる…ということを知りました。

本格対処はsoukan.phpを書き換えることなのですが、暫定対処として、bingbotをブロックすることにしました。

Ansibleの書籍について(2020/04/21)

[結論]
設定を自動化したいサーバーがすでにあるなら
Ansible実践ガイド 第3版 (impress top gear)
横地 晃
インプレス
2019-10-18


設定を自動化したいサーバーがあるわけではなく、Ansibleを体験してみたい方は


かな…と思います。
どっちを買うか迷う場合は「Ansible実践ガイド 第3版」がいいです。

[前置き]
CentOS6からCentOS8へ更改にあたって、ErogameScapeのサーバーの設定をAnsibleですることにしました。

ErogameScapeはもともと自宅サーバーで運用していたのですが、CentOS8への更改を契機に専用サーバーを借用することにしました。
自宅サーバーで運用していたときは2台構成…apacheへのアクセスはkeepalivedで冗長化し、postgresqlの前段にpgpoolをおいて、PostgreSQLは同期レプリケーション構成、pgpoolも冗長構成をとっていました。
この構成は設定するのも運用するのも大変でした。
専用サーバーに移行するにあたって、冗長構成をとるのをやめたので、設定がとてもシンプルになり、Ansibleの本を読み始めてから、playbookの作成完了まで2週間でできました。

設定にあたって、2冊、本を買いました。
書いてある内容の半分くらいしか必要なかった(ネットワーク機器、Windows、クラウドの設定は必要なかった)ので、半分くらいしか読んでいません。

「Ansible実践ガイド 第3版」を一通り読んで、ErogameScapeのplaybookを書き、[Ansible構築・運用ガイドブック]を読みました。


[2つの本について]
Ansibleは実際に書いて動かしてみることがよいです。
どんなふうに書いたらいいか、が多く書いてあるのは、[Ansible実践ガイド 第3版]の方です。
実践の例として、[Ansible実践ガイド 第3版]は、HAproxy、Keepalived、Nginx、PHP-FPM、WordPress、Mariadb(galera-cluster)の設定をしています。
一方、[Ansible構築・運用ガイドブック]は、Nginx、Zabbix、Mariadb(おまけ程度)の設定をしています。
インベントリの書き方、変数の使い方、ロールの使い方、多くのケースで[Ansible実践ガイド 第3版]の方が詳しいです。
[Ansible実践ガイド 第3版]に書いていなくて[Ansible構築・運用ガイドブック]に書いてあって有用だと思ったのは、ansible-lintだけです。

自分は、Keepalived、Nginx、PHP-FPM、WordPressを使ったことがあって、HAproxy、Mariadbも設定を見ればまあわかる、な知識があったので、[Ansible実践ガイド 第3版]をすらすら読めましたが、Keepalived等の冗長化構成をとったことがない方の場合は、ちょっと厳しいかもしれません。
また[Ansible実践ガイド 第3版]は実践する環境を自分で用意しないといけないので、VirtualBOXを使ったことがないと厳しいと思いました。
一方、[Ansible構築・運用ガイドブック]は、著者が実践用のVagrantファイルを用意してくれているので、自分で環境を構築する必要がないです。

以上から、Ansibleを使う必要がある…という方は、多くの場合、すでにサーバーを構築していらっしゃる方だと思うので、[Ansible実践ガイド 第3版]がお勧めです。
サーバーの構築をしたことがないけど、Ansibleがどんなものかを知りたい場合は、[Ansible構築・運用ガイドブック]がいいかなと思います。ただ…[Ansible構築・運用ガイドブック]だと足りないので、[Ansible実践ガイド 第3版]を買うことになるか、Ansibleの公式ドキュメントを読むかになるかと思います。

Ansible実践ガイド 第3版 (impress top gear)
横地 晃
インプレス
2019-10-18

記事検索