読者です 読者をやめる 読者になる 読者になる

Apatchの情報を取得するためにスニペット保存しているワンライナー

Apatchの情報を取得するためにスニペットとして保存しているワンライナーです。

ちなみにスニペットはこのソフトを愛用させていただいています。

qiita.com

プロセス毎のメモリの確認(VmHWM確認)

/proc/PID/statusに色々な情報があります。

こちらに纏めてくれている方がいました。

LinuxTips/プロセスを絞り込んで情報を確認したい - Void of Knowledge

Apacheのメモリを確認いしたい場合、以下のような項目があります。

/proc/PID/statusの項目 説明
VmHWM ある時点で使用した最大物理メモリサイズ
VmRSS 現在使用中の物理メモリサイズ

VmHWMは、実メモリ上のページサイズのピーク値です。空きメモリと相談して、例えば MaxClientsMaxRequestWorkers の計算に利用します。Copy On Writeの動き考慮して後述のワンライナと一緒に使います。

ps aux |grep /usr/sbin/httpd |grep -v grep| awk '{print $2}' | xargs -Ixxx cat /proc/xxx/status |grep VmHWM |sort -nrk2 | awk '{print $0;sum += $2}END{print "Process Count:" "\t" NR;print "Average\t" ":" int(sum/NR/1024) " MB"; print "Total\t" ":" int(sum/1024) " MB" }'
VmHWM:      37688 kB
VmHWM:     23736 kB
VmHWM:     23732 kB
VmHWM:     23684 kB
VmHWM:     23684 kB
VmHWM:     10584 kB
Process Count:  6
Average :23 MB
Total   :139 MB

プロセス毎のメモリの確認(Copy On Write考慮)

コピーオンライトも考慮する必要あるので、[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)に載っていたPerlスクリプト shared_memory_size.pl と同じ情報取るためのワンライナー作って、スニペット保存してあります。

printf "PID\tRSS\tSHARED\n";for pid in $(ps aux |grep /usr/sbin/httpd |grep -v grep |awk '{print $2}' |sort -r);do cat /proc/$pid/smaps | awk -v pid="$pid" 'match($1,/^Rss|^Shared_Dirty|^Shared_Clean/){sum[$1] += $2}END{print pid"\t"sum["Rss:"]"\t"sum["Shared_Dirty:"]+sum["Shared_Clean:"]"\t" int((sum["Shared_Dirty:"]+sum["Shared_Clean:"])/sum["Rss:"]*100)"%"}';done
PID      RSS     SHARED
932     37688   12968   34%
30087   17220   13460   78%
30086   21240   13388   63%
30029   17752   13868   78%
30001   21244   13388   63%
29992   21296   13408   62%
29985   21784   13824   63%
29984   19588   13728   70%

稼働中のApache状況を確認

稼働中のApacheの状況見たい場合に使っているワンライナー。 プロセス数やメモリ利用状況に合わせTCPの状況も一緒に見ています。

watch -n 1 "ps aux | grep /usr/sbin/httpd |grep -v grep |awk '{rss += \$6}END{print \"Average RSS(kb)\t\" \":\" int(rss/NR);print \"Total RSS(kb)\t\" \":\" rss;print \"Process Count\t\" \":\" NR }';echo "TCP State---";netstat -tan |grep \":80\\s\"| awk '{print \$6}' | sort | uniq -c;ps aux|head -n1;ps aux | grep /usr/sbin/httpd |grep -v grep"
Average RSS(kb) :20014
Total RSS(kb)   :140100
Process Count   :7
TCP State---
      1 LISTEN
      2 SYN_RECV
     55 TIME_WAIT
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache   29984  0.1  0.2 619984 19588 ?        S    17:42   0:00 /usr/sbin/httpd
apache   29985  0.1  0.2 619984 19736 ?        S    17:42   0:00 /usr/sbin/httpd
apache   29992  0.1  0.2 622040 21296 ?        S    17:43   0:00 /usr/sbin/httpd
apache   30001  0.1  0.2 619984 19196 ?        S    17:43   0:00 /usr/sbin/httpd
apache   30029  0.1  0.2 619992 19800 ?        S    17:44   0:00 /usr/sbin/httpd
apache   30086  0.0  0.2 619980 19168 ?        S    17:44   0:00 /usr/sbin/httpd
apache   30087  0.1  0.2 622040 21316 ?        S    17:44   0:00 /usr/sbin/httpd

server-status

mod_status 有効にしてあるなら。

curl http://127.0.0.1/server-status/?auto

読み方はこの記事などを参考に。

【apache】server-status at softelメモ

ssコマンド

特にプロセス足りて無くて Recv-Q 溜まっていないかを確認する。

ss -lit '( sport = :http )';echo "----------";ss -tan '( dport = :http or sport = :http )' | awk '{print $1}' | sort | uniq -c | sort -nrk1
State      Recv-Q Send-Q            Local Address:Port                             Peer Address:Port
LISTEN     0      128                          :::http                                       :::*
     cubic rto:1000 mss:536 cwnd:10 lastsnd:1256835055 lastrcv:1256835055 lastack:1256835055
----------
    564 TIME-WAIT
      4 FIN-WAIT-2
      2 SYN-RECV
      1 State
      1 LISTEN
      1 FIN-WAIT-1
      1 ESTAB