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

さくらの専用サーバーにさくらのVPCルータでVPN接続

さくらの専用サーバーにVPNで接続するには以下の4つの方法があります(たぶん)。
  1. 外部回線接続サービスを使う
  2. L3 VPN ファイアウォールを使う(ただし、リモートアクセスVPNは使えない)
  3. さくらのクラウドのVPCルータを使う
  4. SoftEther VPNを使う
SoftEther VPNを使わず、必要とする性能がさくらのクラウドのVPCルータのスタンダードプランで収まるのであれば、さくらのクラウドのVPCルータを使うのが一番安いです。

構成は以下のようになります。
物理構成


論理的な構成は以下のようになります。
論理構成

手順は以下のようになります。
  1. 専用サーバにローカルネットワークを追加する
  2. さくらのクラウドにブリッジを作成し、専用サーバーのローカルネットワークに接続する
  3. さくらのクラウドにスイッチを作成し、先ほど作成したブリッジに接続する
  4. さくらのクラウドにVPCルータを作成し、先ほど作成したスイッチに接続する
  5. VPCルータの設定をする
  6. オンプレミスのRTX1210を設定する
  7. 専用サーバにオンプレミス向けのスタティックルートを設定する
  8. オンプレミス配下のPCに専用サーバ向けのスタティックルートを設定する
VPCルータとRTX1210の設定方法はドキュメントが充実しています。
設定において自分がつまづいた点を記載します。

さくらのクラウドにVPCルータを起動していなかった。
VPCルータは作成しただけでは動いていません。
RTX1210の設定はGUIからはできない。
RTX1210のかんたん設定にはVPN→拠点間接続というメニューがあります。ここをポチポチしていくだけですと設定が足りないのでVPNがはれません。
End-to-End(専用サーバとオンプレミスのPC)でpingが飛ばない。
VPNははれているし、スタティックルートの設定もあっているのに、pingが飛びませんでした。
VPCルータに@sitetosite-use-policyという特殊タグを設定することでpingが飛ぶようになりました。
※さくらインターネットのサポートに連絡して上記方法を教えてもらいました。
VPCルータの性能がスタンダードプランで足りない場合は、プレミアムプランにするか、外部回線接続サービス(VPN接続)にするか検討が必要です。
※価格がほぼ一緒です。

VPCルータのプレミアムプランを使うにはインターネット側にルータ+スイッチを設置する必要があるので構成が以下のようになります。
インターネット -- ルータ+スイッチ(4,400円) -- VPCルータ(プレミアム) (5,238円) -- スイッチ(2,200円) -- ブリッジ(2,700円) -- ローカルネットワーク -- 専用サーバ
で、14,538円/月

外部回線接続サービス(VPN接続)は、さくらインターネットデータセンターにRTX1210を設置してもらい、そのRTX1210とVPCをはります。


Unable to use a TTY - input is not a terminal or the right kind of file

環境 : Windows8.1

Minikube環境で動いているコンテナにGit Bashでkubectl exec -it simple-echo sh -c nginxとnginxのコンテナに入ろうとしたら以下のようなメッセージが出て入れず、Git Bashの応答がなくなりました。
$ kubectl exec -it simple-echo sh -c nginx
Unable to use a TTY - input is not a terminal or the right kind of file
とメッセージは少し違うのですが、winptyを先頭に追加した、無事コンテナに入れました(shできました)。
$ winpty kubectl exec -it simple-echo sh -c nginx
#
Git Bashのttyで怒られないように - Qiita
に記載のあるとおりexec winpty bashを実行して、bashをminttyからwinptyに変更する?(のかな…)といちいちwinpytと入力しなくてすみます。
$ exec winpty bash
$ kubectl exec -it simple-echo sh -c nginx
#

panic: runtime error: index out of range

Windows8でminikube startするとpanic: runtime error: index out of rangeでminikubeが起動できませんでした。
PS C:\Windows\system32> minikube start
* minikube v1.5.2 on Microsoft Windows 8.1 6.3.9600 Build 9600
* Creating hyperv VM (CPUs=2, Memory=2000MB, Disk=20000MB) ...
panic: runtime error: index out of range
理由は分からないのですが、以下のとおりminikube --vm-driver=virtualbox startと--vm-driverにvirtualboxを指定すると起動出来ました。
PS C:\Windows\system32> minikube --vm-driver=virtualbox start
* minikube v1.5.2 on Microsoft Windows 8.1 6.3.9600 Build 9600
* Creating virtualbox VM (CPUs=2, Memory=2000MB, Disk=20000MB) ...
* Found network options:
  - NO_PROXY=192.168.99.100,192.168.99.101,192.168.99.102,192.168.99.103
  - no_proxy=192.168.99.100,192.168.99.101,192.168.99.102,192.168.99.103
* Preparing Kubernetes v1.16.2 on Docker '18.09.9' ...
  - env NO_PROXY=192.168.99.100,192.168.99.101,192.168.99.102,192.168.99.103
  - env NO_PROXY=192.168.99.100,192.168.99.101,192.168.99.102,192.168.99.103
* Downloading kubeadm v1.16.2
* Downloading kubelet v1.16.2
* Pulling images ...
* Launching Kubernetes ...
* Waiting for: apiserver
* Done! kubectl is now configured to use "minikube"
記事検索