Jenkins 死亡時の対策
スレッドが死亡するとこんな表示に…
原因は
1 | No space left on device |
デバイスの容量不足でした。。
対策
以下 cleanBuild.sh を作成しビルド掃除をするようにしました。
過去ビルド履歴が消去されてしまいますが
低コスト運用の為、
背に腹は変えられない!
ビルド履歴はむしろ、Slackに通知してあげてるので
Slackで担保されている、
ということにしよう。
スレッドが死亡するとこんな表示に…
原因は
1 | No space left on device |
デバイスの容量不足でした。。
以下 cleanBuild.sh を作成しビルド掃除をするようにしました。
過去ビルド履歴が消去されてしまいますが
低コスト運用の為、
背に腹は変えられない!
ビルド履歴はむしろ、Slackに通知してあげてるので
Slackで担保されている、
ということにしよう。
あっ!
使い切ってる…
という事象が発生しました。
あるモジュールを導入しようとした際に一気に使い切ってしまった。。
1 | ファイルシス サイズ 使用 残り 使用% マウント位置 |
上記 1,2 を繰り返していくと原因が特定がしやすい。
1 | 対象デバイスに移動し、ファイル容量チェック |
-name ‘*.tar.gz’ など解凍後不要になったアーカイブファイルを検索するもよし。
以前の記事もご参照ください。
yum cache は知らず知らずのうちに大容量になっていることもあります。
諸々削除して
30 % くらいは削れた汗
監視をしっかりせねば
気持ちを抑えられずありがちなタイトルを付けました。
サーバ負荷監視時のボトルネックの特定をする為、
実際に手を動かして自分で見て解決するというチュートリアルとして
本記事を参照いただければ何よりです。
上記の様な事象が発生した場合は
監視グラフに異変が起きているはずです。
その監視グラフを元に
アクセスしづらくなった徴候のある負荷状況を確認し
ボトルネックを特定していきます。
以下、出来るだけ原理を知る上で CLI を元に話を進めていきます。
CPU 負荷を掛けるツールとしてLinux の I/O や CPU の負荷とロードアベレージの関係を詳しく見てみるのスクリプトを拝借しました。
※ありがとうございます @kunihirotanaka 社長!
1 | #!/usr/bin/perl |
ロードアベレージを 2 に近づける様に CPU 負荷を掛ける
1 | $ chmod +x ./loadtest.pl |
top
, vmstat
sar
top
で概要確認1 | $ top |
1 | top - 12:12:39 up 592 days, 18:55, 4 users, load average: 1.97, 1.13, 0.46 |
上記結果から
%CPU
, COMMAND
から上昇の原因は loadtest.pl
暫定的な対処としてはこのプロセスを kill することで負荷を止めることができます。
1 | $ kill -9 6528 |
処理途中でプロセスを kill してしまい不整合が発生する様な処理の場合は
別途、CPU の増強等を検討する等、状況によりますが対応を検討する必要があります。
1 | $ ps ax --sort=-%cpu -o command,pid,pid,%cpu|head -n 11 |
※ -n 11
なのは 1 行目はカラム名が入る為
1 | COMMAND PID PID %CPU |
これまで CLI で確認した考察の答え合わせとして確認しましょう。
top コマンドの様にどのプロセスが原因かまではグラフからは不明です。
サーバにアクセスして 12:07 あたりからのログを調査する等原因を特定していきます。
ちなみに
Apache のモジュールとして PHP を利用している場合は COMMAND
に httpd
と表示されます。fluentd
は ruby で実行されているので ruby
です。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12376 apache 20 0 833m 115m 19m S 2.4 3.1 0:03.52 httpd
1455 td-agent 20 0 461m 74m 0 S 1.2 2.0 1098:30 ruby
vmstat
で CPU 使用率確認1 秒ごとに出力
1 | $ vmstat 1 |
上記から以下のことが確認できます。
./loadtest.pl 2
を実行中は procs r (実行中プロセス) = 2
となっているcpu us
が 100%, cpu id
が 0%cpu id
がなくなり、プログラムが 100% CPU を食いつぶしているsystem in
(割り込み回数)、system cs
(コンテキストスイッチ回数) が増加1 | $ sar -u -s 21:00:00 -e 22:10:00 -f /var/log/sa/sa31 |
sar コマンドは過去まで遡って確認できるので便利です。
Item | Explain |
---|---|
runq-sz | CPU を実行する為のメモリー内で待機中のカーネルスレッド数。 通常、この値は 2 未満になる。 値が常に 2 より大きい場合は、システムが CPU の限界に到達している可能性がある |
plist-sz | プロセスリストのプロセスとスレッド数 |
ldavg-1 | 過去 1 分間のロードアベレージ |
ldavg-5 | 過去 5 分間のロードアベレージ |
ldavg-15 | 過去 15 分間のロードアベレージ |
ロードアベレージを 2 に近づける & システムコールする様に CPU 負荷を掛ける
1 | $ ./loadtest.pl 2 1 |
1 | $ vmstat 1 |
cpu sy
上昇している。1 秒毎に 20MB 消費する様に設定
1 | #!/usr/bin/perl |
1 | $ chmod +x ./memorytest.pl |
top -a
, free
sar
top
で概要確認1 | $ top -a |
もしくは top 実行後、 Shift + m
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6780 mameko_d 20 0 385m 362m 1212 S 5.3 36.4 0:01.88 memorytest.pl
上記結果から
%MEM
, COMMAND
から上昇の原因は memorytest.pl
暫定的な対処としては loadtest.pl と同様、プロセスを kill することで負荷を止めることができます。
1 | $ kill -9 6780 |
free
で残メモリ確認1 | $ free |
何度か実行すると徐々に Mem
の
used
上昇free
減少buffers
, cached
減少free
実行結果各項目Item | Explain |
---|---|
shared | プロセス間で共有できる領域用メモリ |
buffers | buffer に利用されるメモリ I/O アクセスする時に、直接 I/O に行くのではなく、キャッシュ経由でアクセスさせる為のメモリ |
cached | ページキャッシュ用メモリ アプリで実メモリが必要な際は、 cached のメモリが破棄される |
上記 free コマンド実行結果から解放されたメモリは
1 | Mem free 111388 kB = 108 MB |
これだけでは 108 MB
が残りと思いがちですが
通常、各プロセスにメモリ割り振った残りを buffer
と cache
に利用して disk I/O
を軽減している為、
buffer + cache も含まれます。
free
+ buffers
+ cached
= 111388 + 29764 + 204492 kB
= 345644 kB
= 338 MB
= -/+ buffers/cache free
以上から
残メモリの目安は -/+ buffers/cache free
確認 or スラッシングを確認します。
vmstat
実行してスラッシングが発生しているか確認
1 | $ vmstat 1 |
1 | $ ps ax --sort=-rss -o command,pid,ppid,vsz,rss|head -n 11 |
1 | $ sar -b -s 13:00:00 -e 14:00:00 -f /var/log/sa/sa31 |
sar -b
実行結果項目Item | Explain |
---|---|
tps | 1秒あたりの転送 (デバイスに対する IO リクエスト) 数の合計 |
rtps | 1秒あたりの読み込み IO リクエストの回数の合計 |
wtps | 1秒あたりの書き込み IO リクエストの回数の合計 |
bread/s | 1秒あたりの(ブロック単位)読み込み IO リクエストのデータ量の合計 |
bwrtn/s | 1秒あたりの(ブロック単位)書き込み IO リクエストのデータ量の合計 |
1 | プロセスのメモリ消費量増 |
CPU, Memory 使用率が上昇する原理を知った上で監視をすると
全然グラフの見え方が違うことを実感しました。
本来はグラフから見ることになるかと思います。
その際に top
, vmstat
, sar
を実行した時の数値の変化の仕方をイメージすると
より原因追及に大きな一歩となると思います。
以上
少しでも参考になれば幸いです。
カーネルがほぼ利用されていないメモリを検出して排除している状態を表示しています。
その為、 swap が発生している、といって慌てない。
メモリ不足でもメモリの一部をディスクに退避させて計算し続けることができます。
メモリを使い切った様に見せつつもまだ使える仕組みを 仮想メモリ
と言います。
実メモリ と Swap のメモリの移動が大量発生し処理が遅延する現象です。
1 | // CentOS |
Chrome Extention の HTTP/2 and SPDY indicator は
HTTP/2 で通信していることを確認する Chrome の拡張 Plugin です。
これがある日 not enable となっていたので
その対応をまとめます。
ALPN をサポートしていなかった為です。
以下 HTTP/2 通信テストサービスでたどり着きました。
ALPN を サポートしている openssl を 1.0.2 系にし
Nginx を openssl 1.0.2 以上 で rebuild します。
※ 2016/08/10
現時点の最新 1.0.2h
1 | cd /usr/local/src |
1 | which openssl |
1 | nginx -v |
1 | nginx -V |
--add-dynamic-module=njs-1c50334fbea6/nginx
のような njs が含まれている場合は削除します。1 | --with-openssl=/usr/local/src/openssl-1.0.2h |
1 | cd /usr/local/src |
1 | cd /usr/local/src/nginx-1.11.3 |
1 | nginx -V |
1 | nginx -t |
1 | systemctl restart nginx |
青く輝きました!
HTTP/2 テストでも ALPN がサポートされていることが確認できました。
備忘録です。
サイトメンテナンスする際の手順をまとめています。
DocumentRoot に maintenance.html を配置
1 | ErrorDocument 503 /maintenance.html |
以上です。
画像ファイルを指定し
顔検知させる機能を実装しました。
まずはサンプル画像を集めます。
自分はネット上から BeautifulSoup でスクレイピングして落としてみました。
(スクリプトまとめたら公開します)
適当に 13 枚。
ゆくゆくは機械学習したいのでもっと欲しいところですが
今回はスクリプトの紹介がメインなので
この程度で。
スクリプトです。(for Python 3)
1 | // clone |
実際スクリプト実行した様子です。
_trimming
フォルダにトリミングされた画像群が格納されているのがわかります。
以下 No 順に格納されていきます。
No | Item | Explain |
---|---|---|
1 | _resize | 大小さまざまな画像サイズを一定して高さ 500 以下の画像にリサイズします。 |
2 | _addbox | 顔周りに囲い画像が追加された画像が格納されます。各画像でどこが顔として検知されたかの確認用です。 |
2 | _trimming | _addbox に格納されているファイルの顔部分をトリミングした画像を 64×64 サイズにリサイズし 且つ、数度回転させた画像が格納されています。 |
これでサンプル集めが捗れば何よりです。
1 | $ tail -f /var/log/secure |
「/n」 が入ってしまっていました。
「/n」削除すれば問題なくなりました。
多少編集した際に混入させてしまったのかも。。
MacOSX デフォルトでは python 2 系。
python 2.7 は 2020 年までのサポート なので
python 3 系 に慣れておこうということで
3 系環境を構築しようと思いました。
ですが
dlib など Python 2 系でないとうまく設定ができなかった経緯があり
(※自分の不手際の可能性もありますが)
両方残そうということで両仮想環境を構築します。
1 | $ sw_vers |
以下オフィシャルサイト参照してください。
2016/07/28 現在、 python = 2.7.10, python3 = 3.4.3
1 | $ brew install python python3 pyenv |
.bashrc もしくは .zshrc に追記します。
以下仮に .bashrc とします。
1 | vi ~/.bashrc |
1 | export PYENV_ROOT="$HOME/.pyenv" |
1 | $ source ~/.bashrc |
1 | sudo easy_install virtualenv |
1 | $ which python |
1 | $ virtualenv -p /usr/local/bin/python2.7 ~/py2env |
1 | $ which python3 |
1 | $ virtualenv -p /usr/local/bin/python3 ~/py3env |
1 | $ source ~/py2env/bin/active |
1 | $ source ~/py3env/bin/active |
今更ですが備忘録的まとめでした。
Reactio の無料化によりその機能が解放され、様々な監視・アラートツールとの連携が可能になりました。
これを機に Zabbix + Reactio 連携したのでまとめました。
Zabbix 3.0 がインストールされ起動されていることを前提とします。
※既に設定されている場合はスキップしてください。
Configuration > Hosts > create
プロジェクト毎にインシデントを管理します。
https://<Organization ID>
.reactio.jp/settings/project
Zabbix 管理画面で設定している Host 名を Project 名とします。
プロジェクト作成ページと同ページ内にある API 項目の 「+」ボタンクリックし API KEY 発行します。
1 | $ cd /usr/lib/zabbix/alertscripts |
1 | $ cd /usr/lib/zabbix/alertscripts/zabbix-reactio |
<Organization ID>
設定1 | [db_info] |
1 | $ cd /usr/lib/zabbix/alertscripts/zabbix-reactio |
Reacito では全てのインシデントは ID で管理されています。
Zabbix で障害アラート通知時に Reactio インシデント作成 API をコールし インシデント ID を保存します。このインシデント ID は Zabbix で障害回復アラート通知時に Reatio インシデントステータス更新 API をコールする際に利用します。
Administration > Media types Create media type
ボタンクリック
以下値を入力し Add
ボタンクリック
Item | Value |
---|---|
Name | Reactio |
Type | Script |
Script name | zabbix-reactio/reactio.php |
Script Parameters 1 | {ALERT.SUBJECT} |
Script Parameters 2 | {ALERT.MESSAGE} |
Administration > Users Create media type
ボタンクリック
Configuration > Actions Create ボタンクリック
Item | Value |
---|---|
Name | Reactio Notification |
Default subject | PROBLEM alert - {TRIGGER.NAME} is {TRIGGER.STATUS} |
Default message | HOST: {HOST.NAME} TRIGGER_NAME: {TRIGGER.NAME} TRIGGER_STATUS: {TRIGGER.STATUS} TRIGGER_SEVERITY: {TRIGGER.SEVERITY} DATETIME: {DATE} / {TIME} ITEM_ID: {ITEM.ID1} ITEM_NAME: {ITEM.NAME1} ITEM_KEY: {ITEM.KEY1} ITEM_VALUE: {ITEM.VALUE1} EVENT_ID: {EVENT.ID} TRIGGER_URL: {TRIGGER.URL} |
Recovery message | チェック |
Recovery subject | RECOVERY alert - {TRIGGER.NAME} is {TRIGGER.STATUS} |
Recovery message | HOST: {HOST.NAME} TRIGGER_NAME: {TRIGGER.NAME} TRIGGER_STATUS: {TRIGGER.STATUS} TRIGGER_SEVERITY: {TRIGGER.SEVERITY} DATETIME: {DATE} / {TIME} ITEM_ID: {ITEM.ID1} ITEM_NAME: {ITEM.NAME1} ITEM_KEY: {ITEM.KEY1} ITEM_VALUE: {ITEM.VALUE1} EVENT_ID: {EVENT.ID} TRIGGER_URL: {TRIGGER.URL} |
Enabled | チェック |
以下項目から判断して Reactio API を叩いてます。
メッセージを整形する場合でも、 上記項目は残しておくようにしてください。
以上 Zabbix で Reactio 連携設定完了しました。
当方、運用し始めです。
障害レベルによってメッセージを変更したりと今後更新検討致します。
是非以下も合わせて Zabbix-Slack 連携もご利用ください。
以上
ご清聴ありがとうございました。