http https 混在サイトでの Cookie Secure 属性の扱い方
今更聞けない!CPU, Memory 使用率の見方

今更聞けない!CPU, Memory 使用率の見方

気持ちを抑えられずありがちなタイトルを付けました。

サーバ負荷監視時のボトルネックの特定をする為、
実際に手を動かして自分で見て解決するというチュートリアルとして
本記事を参照いただければ何よりです。

サーバに接続し辛い

  • ブラウザから URL を打ち込みサイトにアクセスするもページが表示されない
  • API が timeout する

上記の様な事象が発生した場合は
監視グラフに異変が起きているはずです。

その監視グラフを元に
アクセスしづらくなった徴候のある負荷状況を確認し
ボトルネックを特定していきます。

以下、出来るだけ原理を知る上で CLI を元に話を進めていきます。

サーバに CPU 負荷を掛ける

CPU 負荷を掛けるツールとしてLinux の I/O や CPU の負荷とロードアベレージの関係を詳しく見てみるのスクリプトを拝借しました。
※ありがとうございます @kunihirotanaka 社長!

  • loadtest.pl
    • arg1: 並列実行するプロセス数
    • arg2: システムコールするプログラムを動作させるか判定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

my $nprocs = $ARGV[0] || 1;
for( my $i=0; $i<$nprocs; $i++ ){
my $pid = fork;
die $! if( $pid < 0 );
if( $pid == 0 ){
while(1){
if( $ARGV[1] ){
open(IN, ">/dev/null");
close(IN);
}
}
}
}
wait;

ロードアベレージを 2 に近づける様に CPU 負荷を掛ける

1
2
$ chmod +x ./loadtest.pl
$ ./loadtest.pl 2

CPU 使用状況確認コマンド

  • リアルタイム監視 → top, vmstat
  • 過去確認 → sar

リアルタイム監視

top で概要確認

1
$ top
1
2
3
4
5
6
7
8
9
10
11
12
13
top - 12:12:39 up 592 days, 18:55,  4 users,  load average: 1.97, 1.13, 0.46
Tasks: 125 total, 3 running, 122 sleeping, 0 stopped, 0 zombie
Cpu(s): 99.7%us, 0.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st
Mem: 1020052k total, 943132k used, 76920k free, 144136k buffers
Swap: 2097148k total, 466724k used, 1630424k free, 410784k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29955 mameko_d 20 0 25196 520 184 R 99.9 0.1 4:04.91 loadtest.pl
29956 mameko_d 20 0 25196 516 180 R 99.5 0.1 4:04.86 loadtest.pl
24534 apache 20 0 425m 25m 7480 S 0.3 2.6 1:42.63 httpd
1 root 20 0 19232 412 224 S 0.0 0.0 0:01.77 init
...
...

上記結果から

  • Load Average が上昇している
  • %CPU, COMMAND から上昇の原因は loadtest.pl

暫定的な対処としてはこのプロセスを kill することで負荷を止めることができます。

1
2
$ kill -9 6528
$ kill -9 6529

処理途中でプロセスを kill してしまい不整合が発生する様な処理の場合は
別途、CPU の増強等を検討する等、状況によりますが対応を検討する必要があります。

CPU 使用率高いランキング Top10 表示

1
$ ps ax --sort=-%cpu -o command,pid,pid,%cpu|head -n 11

-n 11 なのは 1 行目はカラム名が入る為

1
COMMAND                       PID   PID %CPU

グラフで見る

これまで CLI で確認した考察の答え合わせとして確認しましょう。

  • 12:07 辺りから負荷上昇
  • loadavg5 急上昇
  • CPU user 急上昇。 CPU system はそこまで上がっていない。
    → アプリケーションのプロセスが CPU を食っている。
  • memory は消費していない

top コマンドの様にどのプロセスが原因かまではグラフからは不明です。
サーバにアクセスして 12:07 あたりからのログを調査する等原因を特定していきます。

補足

ちなみに
Apache のモジュールとして PHP を利用している場合は COMMANDhttpd と表示されます。
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 515396 80756 37120 220320 0 0 12 2 0 0 0 0 100 0 0
0 0 515396 80756 37120 220320 0 0 0 0 110 200 0 0 100 0 0
0 0 515396 80756 37120 220320 0 0 0 0 103 205 0 0 100 0 1
0 0 515396 80632 37120 220320 0 0 0 0 121 212 0 0 99 0 0
0 0 515396 80632 37120 220320 0 0 0 0 114 216 0 0 100 0 0
2 0 515328 80648 36944 220432 0 0 0 0 2092 237 100 0 0 0 0
2 0 515328 80648 36944 220432 0 0 0 0 2071 224 100 0 0 0 0
2 0 515328 81020 36952 220432 0 0 0 0 2162 381 100 1 0 0 0
2 0 515328 80896 36952 220432 0 0 0 0 2164 266 100 0 0 0 0
2 0 515328 80756 36952 220432 0 0 0 0 2139 308 100 0 0 0 0
2 0 515328 80772 36952 220432 0 0 0 0 2111 237 100 0 0 0 0
2 0 515328 80772 36952 220432 0 0 0 0 2087 238 100 0 0 0 0
2 0 515328 80772 36952 220432 0 0 0 0 2077 237 100 0 0 0 0
2 0 515328 80772 36952 220432 0 0 0 0 2076 232 99 1 0 0 0
2 0 515328 80772 36952 220432 0 0 0 0 2078 235 100 0 0 0 0
2 0 515328 80904 36952 220432 0 0 0 0 2081 231 85 0 0 0 15
0 0 515328 81448 36952 220432 0 0 0 0 267 254 6 0 94 0 0
0 0 515328 81448 36952 220432 0 0 0 0 151 250 0 0 99 0 0
0 0 515328 81448 36952 220432 0 0 0 0 230 307 0 0 99 0 0
0 0 515328 81456 36952 220432 0 0 0 0 123 230 0 0 100 0 0

上記から以下のことが確認できます。

  • ./loadtest.pl 2 を実行中は procs r (実行中プロセス) = 2 となっている
  • cpu us が 100%, cpu id が 0%
    • cpu id がなくなり、プログラムが 100% CPU を食いつぶしている
  • system in (割り込み回数)、system cs (コンテキストスイッチ回数) が増加
    • コンテキストスイッチ自体が CPU を食いシステムの負荷を上げている

過去確認

1
2
3
4
5
6
7
8
9
$ sar -u -s 21:00:00 -e 22:10:00 -f /var/log/sa/sa31

21:00:01 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
21:10:01 0 200 0.00 0.04 0.07
21:20:01 0 203 0.00 0.00 0.01
21:30:01 0 203 0.00 0.00 0.00
21:40:01 0 211 0.00 0.03 0.00
21:50:01 0 210 0.65 0.82 0.37
Average: 0 205 0.13 0.18 0.09

sar コマンドは過去まで遡って確認できるので便利です。

sar -q 実行結果各項目
Item Explain
runq-sz CPU を実行する為のメモリー内で待機中のカーネルスレッド数。
通常、この値は 2 未満になる。
値が常に 2 より大きい場合は、システムが CPU の限界に到達している可能性がある
plist-sz プロセスリストのプロセスとスレッド数
ldavg-1 過去 1 分間のロードアベレージ
ldavg-5 過去 5 分間のロードアベレージ
ldavg-15 過去 15 分間のロードアベレージ

システムコールを伴う CPU 負荷

ロードアベレージを 2 に近づける & システムコールする様に CPU 負荷を掛ける

1
$ ./loadtest.pl 2 1

vmstat で監視

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 597832 886856 3808 34844 0 0 12 2 0 0 0 0 100 0 0
1 0 597828 886856 3808 34908 0 0 0 0 134 233 1 0 99 0 0
0 0 597788 886684 3944 34876 20 0 156 0 238 307 1 1 96 4 0
0 0 597788 886684 3944 34904 0 0 0 0 109 219 0 0 100 0 0
2 0 597756 884044 3956 36296 96 0 1500 0 1075 1274 18 26 41 15 0 ← loadtest.pl 2 1 実行開始
2 0 597756 884044 3956 36296 0 0 0 0 2080 2265 42 58 0 0 0
2 0 597756 884076 3956 36296 0 0 0 0 2083 2458 41 60 0 0 0
2 0 597756 884200 3964 36292 0 0 0 32 2103 2458 42 59 0 0 0
2 0 597756 884200 3964 36296 0 0 0 0 2079 2588 41 60 0 0 0
3 0 597756 883952 3964 36296 0 0 0 0 2080 2209 40 60 0 0 1
2 0 597756 884216 3964 36296 0 0 0 0 2085 2395 42 58 0 0 0
2 0 597756 884216 3964 36296 0 0 0 0 2061 2399 43 57 0 0 0
3 0 597756 884092 3964 36296 0 0 0 0 2061 1991 44 57 0 0 0
2 0 597756 884216 3964 36296 0 0 0 0 2059 2333 42 58 0 0 1
2 0 597756 884216 3964 36296 0 0 0 0 2058 2211 42 58 0 0 1
2 0 597756 884092 3964 36296 0 0 0 0 2058 2461 43 58 0 0 0
2 0 597756 883844 3964 36296 0 0 0 0 2059 2641 42 58 0 0 0
2 0 597756 884216 3964 36296 0 0 0 0 2158 2715 42 59 0 0 0 ← loadtest.pl 2 1 実行終了
0 1 597744 884588 3964 36364 44 0 144 0 1995 2313 37 58 3 2 0
0 0 597724 884388 3964 36524 208 0 380 0 173 239 0 1 95 5 0
0 0 597724 884388 3964 36568 0 0 0 0 102 196 0 0 100 0 0
0 0 597636 884388 3964 36568 0 0 0 0 102 203 0 0 100 0 0
0 0 597636 884512 3964 36568 0 0 0 0 104 195 0 0 100 0 1
  • loadtest.pl からシステムコールが多数実行される為、cpu sy 上昇している。

グラフで見る

  • 12:25 辺りから負荷急上昇
  • loadavg5 急上昇
  • CPU user, system 共に急上昇。 system の割合が多い
    → システムコールを伴うアプリケーションのプロセスが CPU を食っている。
  • memory は消費していない

対応例

  • アプリケーションの CPU 使用箇所の特定
    • datadog, NewRelic 等の APM(Aplication Performance Management) 導入しアプリケーションのボトルネック抽出し修正
      • コストこそ掛かりますが非常に有用です
  • CPU 増設
  • 対象アプリのプロセスを kill (先ほどの プロセス kill )
    • 例)管理画面で集計処理し、DB に負荷掛けサービスに影響してしまった時に集計処理のプロセスを kill

サーバにメモリ負荷を掛ける

  • memorytest.pl

1 秒毎に 20MB 消費する様に設定

1
2
3
4
5
6
7
#!/usr/bin/perl

while(1){
sleep 1;
push @h , 1 x 1024 x 1024 x 20
}
wait;
  • メモリ負荷実行
1
2
$ chmod +x ./memorytest.pl
$ ./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
2
3
4
5
6
$ free

total used free shared buffers cached
Mem: 1020052 908664 111388 572 29764 204492
-/+ buffers/cache: 674408 345644
Swap: 2097148 517696 1579452

何度か実行すると徐々に Mem

  • used 上昇
  • free 減少
  • free 減少に引っ張られて buffers, cached 減少
free 実行結果各項目
  • Mem: 実メモリ
  • Swap: 仮想メモリ
Item Explain
shared プロセス間で共有できる領域用メモリ
buffers buffer に利用されるメモリ
I/O アクセスする時に、直接 I/O に行くのではなく、キャッシュ経由でアクセスさせる為のメモリ
cached ページキャッシュ用メモリ
アプリで実メモリが必要な際は、 cached のメモリが破棄される

確認観点

上記 free コマンド実行結果から解放されたメモリは

1
Mem free 111388 kB = 108 MB

これだけでは 108 MB が残りと思いがちですが
通常、各プロセスにメモリ割り振った残りを buffercache に利用して disk I/O を軽減している為、
buffer + cache も含まれます。

実質、残メモリはどこ見れば良い?

free + buffers + cached
= 111388 + 29764 + 204492 kB
= 345644 kB
= 338 MB
= -/+ buffers/cache free

以上から
残メモリの目安は -/+ buffers/cache free 確認 or スラッシングを確認します。

Swap 発生は何を見ればわかる?

vmstat 実行してスラッシングが発生しているか確認

スラッシング確認方法
  • si (swap in from disk), so (swap out to disk) が多発している場合、スラッシングが発生しています
  • so が比較的高い場合、メモリ不足の可能性大
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 593244 211856 3704 34744 0 0 0 0 236 215 4 2 94 0 0
1 0 593244 211876 3704 34744 0 0 0 0 144 216 1 0 98 0 0
0 0 593244 160664 3704 34744 0 0 0 0 207 220 4 1 96 0 0
0 0 593244 109328 3704 34744 0 0 0 0 227 226 4 2 94 0 0
0 1 593052 58900 3704 33312 0 0 0 0 515 241 4 2 59 34 0
0 1 618460 55144 1224 15220 0 25416 0 25416 39357 528 5 24 34 37 1 ← ここで memorytest.pl 行開始
0 1 670408 56644 1160 13732 0 51948 0 51948 37384 644 7 22 34 37 1
1 1 671048 59256 456 12480 0 640 0 640 182 254 1 1 49 50 0
0 0 735892 72040 436 10088 0 64844 96 64844 14559 1044 3 15 67 15 0
0 0 786748 71436 436 9596 0 50856 124 50856 13678 745 4 13 69 14 1
0 2 830880 63556 436 9504 32 44144 320 44144 15659 636 5 13 54 28 0
0 3 849932 48976 436 8652 304 19168 1104 19168 6568 661 6 6 32 55 1
0 1 900916 71564 776 8264 88 50992 560 50992 9549 706 1 10 27 62 0
0 3 941292 64152 1308 9880 80 40380 2564 40380 10800 622 5 11 29 56 1
0 1 993108 69908 1700 10656 0 51820 2024 51852 10208 848 5 12 43 40 1
2 0 994168 71536 1700 10428 0 1060 0 1060 216 257 3 1 82 15 0
0 0 1045720 71384 1700 9456 0 51552 0 51552 5356 789 2 9 77 12 1
0 0 1096468 71468 1332 9012 0 50748 0 50748 15385 857 6 13 72 9 1
  • bo (block out to device) … ブロックデバイスに送られたブロック
  • bi (block in from device) … ブロックデバイスから受け取ったブロック

物理メモリ使用量(Resident Set Size)高いランキング Top10 表示

1
$ ps ax --sort=-rss -o command,pid,ppid,vsz,rss|head -n 11

グラフで見る

  • 12:35 辺りからメモリ急上昇
  • cached 減、 used 増

対応例

  • プロセスレベルで監視
    • datadog, mackerel, prometheus, zabbix 等監視ツール導入
  • メモリ増設
  • 対象アプリのプロセスを kill (先ほどの プロセス kill )

Disk I/O

I/O ディスク利用状況 確認

1
2
3
4
5
6
7
8
9
$ sar -b -s 13:00:00 -e 14:00:00 -f /var/log/sa/sa31

13:00:01 tps rtps wtps bread/s bwrtn/s
13:10:01 0.28 0.01 0.27 0.11 2.90
13:20:01 0.28 0.00 0.28 0.05 2.99
13:30:01 0.22 0.00 0.22 0.00 2.30
13:40:01 0.24 0.00 0.24 0.00 2.50
13:50:01 0.23 0.00 0.23 0.03 2.35
Average: 0.25 0.00 0.25 0.04 2.61

sar -b 実行結果項目

Item Explain
tps 1秒あたりの転送 (デバイスに対する IO リクエスト) 数の合計
rtps 1秒あたりの読み込み IO リクエストの回数の合計
wtps 1秒あたりの書き込み IO リクエストの回数の合計
bread/s 1秒あたりの(ブロック単位)読み込み IO リクエストのデータ量の合計
bwrtn/s 1秒あたりの(ブロック単位)書き込み IO リクエストのデータ量の合計

確認観点

  • I/O 待ち増加する原理
1
2
3
4
5
6
7
8
9
プロセスのメモリ消費量増

キャッシュにメモリが使えなくなる

Disk I/O にメモリが使えなくなる

Disk I/O 増加

I/O 待ちプロセス増加

対策

  • メモリの使用状況と Swap 確認

まとめ

CPU, Memory 使用率が上昇する原理を知った上で監視をすると
全然グラフの見え方が違うことを実感しました。

本来はグラフから見ることになるかと思います。
その際に top, vmstat, sar を実行した時の数値の変化の仕方をイメージすると
より原因追及に大きな一歩となると思います。

以上
少しでも参考になれば幸いです。

Reference

補足

Swap とは?

カーネルがほぼ利用されていないメモリを検出して排除している状態を表示しています。

  1. メモリの空きを入出力のバッファとキャッシュに使用
  2. さらに活動が少ない部分をメモリから排除して swap へ押し出す
  3. swap からバッファやキャッシュに転用

その為、 swap が発生している、といって慌てない。

Swap を利用する意義

メモリ不足でもメモリの一部をディスクに退避させて計算し続けることができます。
メモリを使い切った様に見せつつもまだ使える仕組みを 仮想メモリ と言います。

スラッシングとは?

実メモリ と Swap のメモリの移動が大量発生し処理が遅延する現象です。

sar コマンドがない場合はインストール

1
2
3
4
5
// CentOS
$ yum install -y sysstat

// Ubuntu
$ apt-get install -y sysstat
ある日 Nginx で HTTP/2 and SPDY indicator が青く輝いてくれなくなった件

ある日 Nginx で HTTP/2 and SPDY indicator が青く輝いてくれなくなった件

概要

Chrome Extention の HTTP/2 and SPDY indicator は
HTTP/2 で通信していることを確認する Chrome の拡張 Plugin です。

これがある日 not enable となっていたので
その対応をまとめます。

結果的に何が原因だったか

ALPN をサポートしていなかった為です。

ALPN Wiki

以下 HTTP/2 通信テストサービスでたどり着きました。

では何を対応するか

ALPN を サポートしている openssl を 1.0.2 系にし
Nginx を openssl 1.0.2 以上 で rebuild します。

2016/08/10 現時点の最新 1.0.2h

OpenSSL 1.0.2h インストール

1
2
3
4
5
6
7
8
# cd /usr/local/src
# wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
# tar xvf openssl-1.0.2h.tar.gz
# cd openssl-1.0.2h
# ./config
# make
# make test
# make install

現状の OpenSSL と置き換え

1
2
3
4
5
6
7
8
# which openssl
/usr/bin/openssl

# mv /usr/bin/openssl /root/
# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

# openssl version
OpenSSL 1.0.2h 3 May 2016

Nginx バージョン確認

1
2
# nginx -v
nginx version: nginx/1.11.3

現状の configure 状況確認

1
2
3
4
5
6
7
# nginx -V

nginx version: nginx/1.11.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --add-dynamic-module=njs-1c50334fbea6/nginx --with-threads --with-stream --with-stream_ssl_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'
  • Configure パラメータに --add-dynamic-module=njs-1c50334fbea6/nginx のような njs が含まれている場合は削除します。
    含まれている場合、 configure がこけます。 (前回記事参照)
  • 明示的に openssl を指定する為、以下パラメータを追加
1
--with-openssl=/usr/local/src/openssl-1.0.2h

現状の Nginx バージョンを変更しない前提で 1.11.3 の ソースをダウンロード

1
2
3
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.11.3.tar.gz
# tar xvf nginx-1.11.3.tar.gz

Nginx リビルド

1
2
3
4
5
6
# cd /usr/local/src/nginx-1.11.3
# ./configure --prefix=/etc/nginx --with-openssl=/usr/local/src/openssl-1.0.2h --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

# make
# make test
# make install

version 確認

  • built with OpenSSL が 1.0.2h となっていることが確認できます。
1
2
3
4
5
6
# nginx -V
nginx version: nginx/1.11.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --with-openssl=/usr/local/src/openssl-1.0.2h --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

Nginx シンタックスチェック

1
2
3
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginx 再起動

1
# systemctl restart nginx

HTTP/2 and SPDY indicator 確認

青く輝きました!

HTTP/2 テストでも ALPN がサポートされていることが確認できました。

メンテ時に社内Wifi IPのみサイトアクセス許可する

メンテ時に社内Wifi IPのみサイトアクセス許可する

備忘録です。

サイトメンテナンスする際の手順をまとめています。

手順

maintenance.html

DocumentRoot に maintenance.html を配置

.htaccess にてアクセス制限

1
2
3
4
5
6
7
8
9
10
11
12
ErrorDocument 503 /maintenance.html

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^.*\.(js|css|gif|jpg|png|ico)$
RewriteCond %{REQUEST_URI} !^/cron/.*$
RewriteCond %{REQUEST_URI} !=/maintenance.html
# 社内
RewriteCond %{REMOTE_ADDR} !=<社内Wifi IP>
RewriteCond %{REMOTE_ADDR} !=<社内Wifi IP>
RewriteRule ^.*$ - [R=503,L]
</IfModule>

以上です。

複数画像ファイルから顔検知し顔部分をトリミングしたサンプルを集める

複数画像ファイルから顔検知し顔部分をトリミングしたサンプルを集める

前回

画像ファイルを指定し
顔検知させる機能を実装しました。

今回

まずはサンプル画像を集めます。
自分はネット上から BeautifulSoup でスクレイピングして落としてみました。
(スクリプトまとめたら公開します)

適当に 13 枚。
ゆくゆくは機械学習したいのでもっと欲しいところですが
今回はスクリプトの紹介がメインなので
この程度で。

顔部分トリミング

スクリプトです。(for Python 3)

1
2
3
4
5
6
// clone
$ git clone https://gist.github.com/kenzo0107/517258ab06715f73c4a3457e87fd25a5
$ cd 517258ab06715f73c4a3457e87fd25a5

// スクリプト実行
$ python collect_face_samples.py -p <サンプル画像が格納されているディレクトリ>

実際スクリプト実行した様子です。

_trimming フォルダにトリミングされた画像群が格納されているのがわかります。

以下 No 順に格納されていきます。

No Item Explain
1 _resize 大小さまざまな画像サイズを一定して高さ 500 以下の画像にリサイズします。
2 _addbox 顔周りに囲い画像が追加された画像が格納されます。各画像でどこが顔として検知されたかの確認用です。
2 _trimming _addbox に格納されているファイルの顔部分をトリミングした画像を 64×64 サイズにリサイズし
且つ、数度回転させた画像が格納されています。

これでサンプル集めが捗れば何よりです。

MacOSX に Python2, Python3 仮想環境構築

MacOSX に Python2, Python3 仮想環境構築

経緯

MacOSX デフォルトでは python 2 系。

python 2.7 は 2020 年までのサポート なので
python 3 系 に慣れておこうということで
3 系環境を構築しようと思いました。

ですが
dlib など Python 2 系でないとうまく設定ができなかった経緯があり
(※自分の不手際の可能性もありますが)
両方残そうということで両仮想環境を構築します。

環境

1
2
3
4
5
$ sw_vers

ProductName: Mac OS X
ProductVersion: 10.11.5
BuildVersion: 15F34

Homebrew インストール

以下オフィシャルサイト参照してください。

Homebrew Ja

Python2, 3 インストール

2016/07/28 現在、 python = 2.7.10, python3 = 3.4.3

1
$ brew install python python3 pyenv

設定ファイル

.bashrc もしくは .zshrc に追記します。

以下仮に .bashrc とします。

1
$ vi ~/.bashrc
1
2
3
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
  • 設定読み込み
1
$ source ~/.bashrc

virtualenv インストール

1
sudo easy_install virtualenv

仮想環境構築

  • python2 での仮想環境構築
1
2
3
$ which python

/usr/local/bin/python2.7
1
$ virtualenv -p /usr/local/bin/python2.7 ~/py2env
  • python3 での仮想環境構築
1
2
3
$ which python3

/usr/local/bin/python3
1
$ virtualenv -p /usr/local/bin/python3 ~/py3env

仮想環境切り替え

  • Python 2.7 仮想環境へ切り替え
1
$ source ~/py2env/bin/active
  • Python 3.4 仮想環境へ切り替え
1
$ source ~/py3env/bin/active

今更ですが備忘録的まとめでした。

Zabbix + Reactio 連携

Zabbix + Reactio 連携

概要

Reactio の無料化によりその機能が解放され、様々な監視・アラートツールとの連携が可能になりました。
これを機に Zabbix + Reactio 連携したのでまとめました。

Reactio が無料になります

環境

  • Zabbix 3.0
  • CentOS Linux release 7.2.1511 (Core)

Zabbix 3.0 がインストールされ起動されていることを前提とします。

Zabbix 管理画面で Host 設定

※既に設定されている場合はスキップしてください。

Configuration > Hosts > create

  • Host name: Project1

Reactio プロジェクト作成

プロジェクト毎にインシデントを管理します。

https://<Organization ID>.reactio.jp/settings/project

Zabbix 管理画面で設定している Host 名を Project 名とします。

Reactio API 発行

プロジェクト作成ページと同ページ内にある API 項目の 「+」ボタンクリックし API KEY 発行します。

zabbix-reactio インストール

1
2
$ cd /usr/lib/zabbix/alertscripts
$ git clone http://github.com/zabbix-reactio

Zabbix DB 情報 と Reactio で作成した Project と 発行した API KEY を設定ファイルに設定

1
2
$ cd /usr/lib/zabbix/alertscripts/zabbix-reactio
$ vi config.inc
  • db_info に DB 情報設定
  • <Organization ID> 設定
  • Project = API KEY 設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[db_info]
host = <DB Host>
user = <DB user>
pass = <DB pass>
db = <DB name>

[reactio_url]
default = https://<Organization ID>.reactio.jp/api/v1/incidents

[api_key]
Project1 = <Project1's API KEY>
Project2 = <Project2's API KEY>
Project3 = <Project3's API KEY>
...
...

DB カラム追加

  • Zabbix alerts テーブルに Reactio Incident ID カラムを追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ cd /usr/lib/zabbix/alertscripts/zabbix-reactio
$ mysql -h <DB Host> -u <DB user> -p<DB pass> <DB name> -e "`cat add_reactioincidentid.sql`"
$ mysql -h <DB Host> -u <DB user> -p<DB pass> <DB name> -e "SHOW COLUMNS FROM alerts"

+---------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------+-------+
| alertid | bigint(20) unsigned | NO | PRI | NULL | |
| actionid | bigint(20) unsigned | NO | MUL | NULL | |
| eventid | bigint(20) unsigned | NO | MUL | NULL | |
| userid | bigint(20) unsigned | YES | MUL | NULL | |
| clock | int(11) | NO | MUL | 0 | |
| mediatypeid | bigint(20) unsigned | YES | MUL | NULL | |
| sendto | varchar(100) | NO | | | |
| subject | varchar(255) | NO | | | |
| message | text | NO | | NULL | |
| status | int(11) | NO | MUL | 0 | |
| retries | int(11) | NO | | 0 | |
| error | varchar(128) | NO | | | |
| esc_step | int(11) | NO | | 0 | |
| alerttype | int(11) | NO | | 0 | |
| reactio_incident_id | int(11) | NO | | 0 | | ← 追加されているのが確認できます
+---------------------+---------------------+------+-----+---------+-------+

Reacito では全てのインシデントは ID で管理されています。
Zabbix で障害アラート通知時に Reactio インシデント作成 API をコールし インシデント ID を保存します。

このインシデント ID は Zabbix で障害回復アラート通知時に Reatio インシデントステータス更新 API をコールする際に利用します。

Zabbix Media types: Reactio 作成

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}

Zabbix Users: Reactio 作成

Administration > Users Create media type ボタンクリック

  • Reactio ユーザ作成
  • Media タブをクリックし Media 情報入力
  • Permission タブをクリックし Zabbix Super Admin 選択
  • Add ボタン クリックし一覧に表示されることを確認

Zabbix Actions: Reactio Notification 作成

Configuration > Actions Create ボタンクリック

  • Action タブ選択し Action 情報入力
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 を叩いてます。

  • subject の PROBLEM/RECOVERY
  • HOST: {HOST.NAME}
  • EVENT_ID: {EVENT.ID}

メッセージを整形する場合でも、 上記項目は残しておくようにしてください。

  • Operations タブ選択し Operations 情報入力

以上 Zabbix で Reactio 連携設定完了しました。

実行結果

  • インシデント作成できた!
  • 作成したインシデントのステータスが更新された!

今後

当方、運用し始めです。
障害レベルによってメッセージを変更したりと今後更新検討致します。

是非以下も合わせて Zabbix-Slack 連携もご利用ください。

zabbix3-slack

以上
ご清聴ありがとうございました。

Raspberry Pi 3 B に Raspberry Jessie セットアップ

概要

Amazon Prime 会員の無料体験版で
Raspberry Pi 3 B 買いました♪

開発 Ready な状態を作るべく
そのセットアップ方法をまとめました。

環境

  • MacBook Pro : MacOSX 10.11.5
  • Wifi 環境

買ったもの

以下最低限必要なものです。

計 8,459円

  • Raspberry Pi 3 Model B (ケース付き): 5,980円
  • SD カード (32GB) : 1,080円
  • 電源 (2.5A対応): 1,399円

電源はPCのUSBポートからでも良いかな、と思ってましたが
Pi3Bの推奨電流が 2.5 A となった為、2.5 A 対応電源が必要になりました。

その他

大体持ち合わせてるのでは、と思います。
会社のゴミ山に捨ててあるのではないでしょうか。

  • HDMI ケーブル : 691円
  • USBキーボード : 530円
  • USBマウス : 698円

その他含めても 10,378円。こりゃやるっきゃない。

早速セットアップ手順へ

SDカード フォーマット

SD カードフォーマットアプリ インストール

以下サイトからSDカードフォーマッターアプリをダウンロードしフォーマットします。

SD Memory Card Formatter

Macであれば for Mac を選択し
同意してダウンロードします。

ファイルシステム確認

フォーマットするSDカードがどれか知る必要がある為、
SDカードを差し込む前にターミナルから以下実行

1
$ df -h

SDカードをMacに差し込む

※MacBook AirではSDカード差し込み口がないのでカードリーダで読込みます。

もう一度 df -h すると
新たに追加されたのが SDカード のファイルシステムです。

SDFormatter でフォーマット

※ 自分は名前を「RASP3B」としました。

もう一度 df -h

ディスクイメージ名が変更されているのがわかります。

以上でSDカードフォーマット完了です。

ディスクイメージに Raspbian Jessie (Latest OS) を書き込み

Raspbian Jessie ダウンロード

オフィシャルサイトから最新 Raspbian OS をインストールします。
数分掛かります。

Raspbian

1
2
3
4
5
$ cd ~/Downloads
$ unzip 2016-05-27-raspbian-jessie.zip
$ ls -al 2016-05-27-raspbian-jessie.*
-rw-r--r--@ 1 kenzo staff 4019191808 5 27 20:50 2016-05-27-raspbian-jessie.img
-rw-r--r--@ 1 kenzo staff 1393896178 7 10 19:27 2016-05-27-raspbian-jessie.zip

アンマウント

先ほど確認した ファイルシステム名 /dev/disk2s1 から s1 を取り除いた、
イメージ対象をアンマウントする

1
$ diskutil umountDisk /dev/disk2

ダウンロードしたイメージを書き込み

1
$ sudo dd if=/Users/<User>/Downloads/2016-05-27-raspbian-jessie.img of=/dev/rdisk2 bs=1m
  • disk2r を頭に足すとアンバッファモードで実行し速度アップします。
  • bs=1m … 1度に書き込むサイズ

257 秒かかった 汗

以上で Raspberry Pi に挿す SDカード が作成できました。

SDカード取り出し

1
$ diskutil eject /dev/disk2

Raspberry PI 3 に 各種接続

全て接続し終わるまでRaspberry Pi に電流を流さないでください。

SDカード挿入

USBキーボード・マウス、SDカード、電源 接続

全てが深く刺さっているのを確認した後
いよいよ電源を電源アダプタに接続します。

ついた!

なにやら読み込みが始まった!

※我が家はテレビがディスプレイ代わりです。

おぉ〜GUIのトップ画面がでてきた!

まず成功♪

Raspberry Pi 各種設定

Menu > Preferences > Raspberry Pi Configuration クリック

SDカードの全容量を利用可能にする

  • System タブの Expand Filesystem ボタンクリック

以上でSDカードの全容量を利用可能になります。

Locale設定

  • Localisation タブの Set Locale ボタンをクリックします。
  • Language : ja (Japanese) 選択
  • Country : JP (Japan) 選択
  • Character Set : UTF-8 選択

上記選択し OK ボタンクリック

Timezone設定

  • Localisation タブ > Set Timezone ボタン クリック

再度 Set Timezone ボタンをクリックすると Asia/Tokyo が選択されています。

キーボード設定

  • Localisation タブの Set Keyboard ボタンをクリック

  • Country : Japan 選択

  • Variant : Japanese 選択

以上選択しOK ボタンクリック

Wifi 設定

  • Wifi 選択しパスフレーズ入力し Wifi接続
  • Wifi 接続が確認できます

MacOS → Raspberry Pi SSH 接続

  • Raspberry Pi で Terminal 起動
1
$ ifconfig
  • Mac から raspberry pi に SSH接続
1
2
3
4
5
6
7
8
9
10
[MacOSX local]$ ssh pi@192.168.xxx.xxx
pi@192.168.11.18's password: <デフォルトパスワードは "raspberry">

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jul 11 23:08:51 2016

SSH ログインが確認できました!

追記 (2016-07-08)

あとあと気づいたのだけど
わざわざ画面をiPhoneで撮影せずとも
Remote Desktop して綺麗なものを取ればよかった。。

ということで
SSH ついでに Remote Desktop 機能を要する tightvncserver インストール

1
2
3
4
5
$ sudo apt-get install tightvncserver
$ vncserver

// 起動
$ vncserver :1
  • 設定したホスト名を指定してRemote Desktop し画面共有
1
vnc://raspberrypi.local:5901

ブラウザを開いてみる

インターネットに接続されているのがわかります。

ただし
日本語がもれなく豆腐。。

Zabbix でも以前日本語フォントがなくて同様の事象がありました。。

日本語フォントをインストールする必要があります。

Raspberry Pi に日本語フォントインストール

1
2
3
4
5
6
$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
$ sudo apt-get install ibus-mozc

// 再起動
$ sudo shutdown -r now

もう一度ブラウザを開いてみる

  • 日本語がちゃんと表示されています。
  • 日本語入力できるよう、日本語 - Mozc 選択

以上でセットアップ完了です。

ご清聴ありがとうございました。

CentOS5 系 に pip インストール

CentOS5 系 に pip インストール

2017 年 3 月にサポート終了する CentOS5 ですが
今なお利用されているサーバは多々あるかと思います。

今回の目的

デフォルトインストールされている Python 2.4.3 を残した状態で
Python 2.6 をインストールし、pip の上位バージョンを利用できるようにする、
ことを目的とします。

EPEL リポジトリ追加

1
$ sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm

通常アップデートで EPEL からアップグレードするのを避ける様設定

1
2
3
4
5
$ sudo vi /etc/yum.repos.d/epel.repo

[epel]
...
enabled=0

EPEL リポジトリから python26 インストール

1
$ sudo yum install python26 -y --enablerepo=epel

バージョン確認

1
2
3
4
5
$ python26 -V
Python 2.6.8

$ python -V
Python 2.4.3

あくまで python26 は pip を利用するようにする為に共存させています。

pip インストール

1
2
3
$ wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
$ sudo python26 ez_setup.py --insecure
$ sudo easy_install-2.6 pip
1
2
$ pip --version
pip 8.1.2 from /usr/lib/python2.6/site-packages/pip-8.1.2-py2.6.egg (python 2.6)