linuxサーバーのメモリーが足りていないかどうか調べる

webページが表示されないことが頻発する。
メモリが十分かどうか調べる。

参考:http://www.math.kobe-u.ac.jp/HOME/kodama/tips-free-memory.html

------------------------------------------
free -m
------------------------------------------

------------------------------------------
# free -m
total used free shared buffers cached
Mem: 3961 3784 176 0 39 2942
-/+ buffers/cache: 802 3159
Swap: 2047 255 1792
------------------------------------------

total は、サーバーの搭載メモリー。さくらのVPSは4Gで契約なのでこんなもの。
空き容量は Mem の free ではなく -/+ buffers/cache の free

メモリ全体が 3961 に対して free が 3159 なのでまだまだ余裕なことが分かる。

MaxClients及びServerLimitのベストな設定値

参考ページ:https://www.netmarvs.com/archives/3518

上記ページでは次のような式で MaxClients の値を求めている。
-----------------------------------------------
MaxClients = サーバ合計メモリ * (80%〜70%) / httpdプロセスの最大メモリ使用量(子httpdピーク時の平均値です。)
-----------------------------------------------

これを自分の環境の置き換えると
-----------------------------------------------
MaxClients = 4G(さくらのvpsサーバ合計メモリ) * (80%〜70%) / httpdプロセスの最大メモリ使用量(子httpdピーク時の平均値です。)
-----------------------------------------------

 

 

1プロセス当たりのメモリ使用量の調べ方

-----------------------------------------------
ps aux
-----------------------------------------------

結果(一部)
-----------------------------------------------
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19356 624 ? Ss Aug27 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S Aug27 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Aug27 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Aug27 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Aug27 0:00 [stopper/0]
root 6 0.0 0.0 0 0 ? S Aug27 0:00 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Aug27 0:00 [migration/1]
root 8 0.0 0.0 0 0 ? S Aug27 0:00 [stopper/1]
root 9 0.0 0.0 0 0 ? S Aug27 0:00 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S Aug27 0:00 [watchdog/1]
root 11 0.0 0.0 0 0 ? S Aug27 0:00 [migration/2]
root 12 0.0 0.0 0 0 ? S Aug27 0:00 [stopper/2]
root 13 0.0 0.0 0 0 ? S Aug27 0:00 [ksoftirqd/2]
root 14 0.0 0.0 0 0 ? S Aug27 0:00 [watchdog/2]
root 15 0.0 0.0 0 0 ? S Aug27 0:00 [migration/3]
root 16 0.0 0.0 0 0 ? S Aug27 0:00 [stopper/3]
root 17 0.0 0.0 0 0 ? S Aug27 0:00 [ksoftirqd/3]
root 18 0.0 0.0 0 0 ? S Aug27 0:00 [watchdog/3]
root 19 0.0 0.0 0 0 ? S Aug27 0:03 [events/0]
root 20 0.0 0.0 0 0 ? S Aug27 0:04 [events/1]
root 21 0.0 0.0 0 0 ? S Aug27 0:06 [events/2]
root 22 0.0 0.0 0 0 ? S Aug27 0:04 [events/3]
root 23 0.0 0.0 0 0 ? S Aug27 0:00 [events/0]

(中略)

apache 5406 0.2 0.3 376408 14648 ? S 13:36 0:01 /usr/sbin/httpd
apache 5407 0.3 0.3 376316 15168 ? S 13:36 0:02 /usr/sbin/httpd
apache 5408 0.1 0.3 377308 15624 ? S 13:36 0:00 /usr/sbin/httpd
apache 5409 0.1 0.3 376404 14676 ? S 13:36 0:01 /usr/sbin/httpd
apache 5412 0.3 0.3 376896 15140 ? S 13:36 0:01 /usr/sbin/httpd
apache 5413 0.2 0.4 379216 17620 ? S 13:36 0:01 /usr/sbin/httpd
apache 5420 0.4 0.4 380156 18808 ? S 13:37 0:02 /usr/sbin/httpd
apache 5422 0.3 0.3 376148 14596 ? S 13:37 0:01 /usr/sbin/httpd
apache 5423 0.5 0.4 430376 16852 ? S 13:38 0:02 /usr/sbin/httpd
apache 5424 0.3 0.3 430116 16212 ? S 13:38 0:01 /usr/sbin/httpd
apache 5455 0.5 0.3 376884 15288 ? S 13:42 0:01 /usr/sbin/httpd
apache 5456 0.2 0.3 376132 14268 ? S 13:42 0:00 /usr/sbin/httpd
apache 5457 0.4 0.3 376644 14904 ? S 13:42 0:00 /usr/sbin/httpd
apache 5458 0.4 0.3 376144 14480 ? S 13:42 0:00 /usr/sbin/httpd
apache 5459 0.1 0.3 375904 13836 ? S 13:43 0:00 /usr/sbin/httpd
apache 5460 0.4 0.3 377724 15548 ? S 13:43 0:00 /usr/sbin/httpd
apache 5461 0.1 0.3 375220 13224 ? S 13:43 0:00 /usr/sbin/httpd
apache 5462 0.2 0.3 375472 13428 ? S 13:43 0:00 /usr/sbin/httpd
apache 5463 0.4 0.3 374864 12720 ? S 13:44 0:00 /usr/sbin/httpd
apache 5464 0.2 0.3 375224 13160 ? S 13:44 0:00 /usr/sbin/httpd
apache 5468 3.0 0.3 374876 12584 ? S 13:45 0:00 /usr/sbin/httpd
root 5471 0.0 0.0 110252 1132 pts/0 R+ 13:45 0:00 ps aux
-----------------------------------------------

書きかけだけどまだまだメモリに余裕があったため MaxClients は適当に増やしたので、生地は未完

サーバーが重い、ページが開かない 20210819

運営サイトでサーバーが重くなった。タイムアウトでページが開かないことが多発した。
ipアドレスでアクセスした場合は問題なし。ドメインでアクセスした場合のみ問題が発生。

ニ三日前からページにアクセスしづらい状態がたびたび起こっている。ちょうどデーターベースの書き換えでサーバーに負荷のかかる作業だったので、それが原因かとデータベースを削除したり解決策を検索したが解決に至らず。

さくらインターネットに問い合わせて見る。

 

送ったメール内容
---------------------------------------------------------

サーバーに利用制限がかかっていませんか?
二日ほど前多少サーバーに負荷のかかる処理をしました。そのあとからページの表示がされにくくなりました。
ブラウザからページにアクセスしても「サーバーが応答しません」と出ます。
ipアドレスでアクセスした場合は問題なく表示されますが、ドメイン名でアクセスした場合のみ問題が起こります。
http://160.○○○.○○○.○○○/index.html ← 問題ない
http://独自ドメイン/index.html ← 表示されない
調査をお願いします。
---------------------------------------------------------

一時間ほどで返信あり。
返信の内容
---------------------------------------------------------
現時点で弊社にて実施している制限はございません。

また、IPアドレスでブラウズ可能ということでございましたら仮想サーバ
自体の障害や制限によるものとは考えにくいものでございます。

恐れ入りますが「さくらのVPS」は、お客様に管理者権限をお渡ししている
サービスとなり仮想サーバの構築・運用・保守にいたる管理全般をお客様にて
実施いただいております。

そのため、弊社ではお客様のご利用いただく仮想サーバ内のシステム状況
などを把握や調査、トラブルシューティング等の技術的なサポートは承って
おりません。

お手数ですが、仮想サーバ内の設定やドメインのゾーンを管理するネーム
サーバに問題がないなど、サーバ管理者様にてご確認いただきますよう
お願いいたします。
---------------------------------------------------------
このメールを受け取った前後に再度ページにアクセスしたら滞りなくページが開いた。
時間が解決してくれたということか?

一週間後・・・。

再びアクセスエラー。

再調査する。

このページが参考になりそう

https://meteoricstream.com/tips_detail/45.html

したこと。

手元の windows コマンドプロンプトから ping 送信 → 問題なし。

 

アクセスログを調べる。
rootで
cat /var/log/httpd/access_log

エラーログを調べる。
cat /var/log/httpd/error_log

 

エラーログ一部抜粋
-------------------------------------------------------------------------------------------
[Fri Aug 27 01:28:32 2021] [error] server reached MaxClients setting, consider raising the MaxClients setting
-------------------------------------------------------------------------------------------
訳:サーバーは MaxClients の設定値に達しました。MaxClients の設定値を大きくすることを検討してください。
setting → 設定(値)

↑ 上記メッセージは、Webサーバの起動後、リクエスト数がはじめてクライアントの同時接続数に達した際に一度だけ出るみたい。

 

MaxClients の値を上げるには httpd.conf の値を変えればいいらしい。

cat /etc/httpd/conf/httpd.conf

 

httpd.conf を開くと MaxClients ディレクティブが二つあった
httpd.conf 一部抜粋
-------------------------------------------------------------------------------------------
# prefork MPM

# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
-------------------------------------------------------------------------------------------

workerで動いてるか、preforkで動いてるか確認

コンソールで apachectl -l もしくは httpd -l を実行
apachectl と httpd はほぼ同じ内容で、どちらも httpd の軌道や停止をするコマンド

-------------------------------------------------------------------------------------------
# apachectl -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
-------------------------------------------------------------------------------------------

prefork で動いているという事らしい
デフォルトでは prefork ということ

httpd -V もしくは apachectl -V コマンドでも確認できる
Server MPM: の部分を確認

結果
-------------------------------------------------------------------------------------------
# httpd -V
Server version: Apache/2.2.15 (Unix)
Server built: Oct 19 2017 16:43:38
Server's Module Magic Number: 20051115:25
Server loaded: APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
-------------------------------------------------------------------------------------------

 

httpd.confより抜粋
-------------------------------------------------------------------------------------------
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
-------------------------------------------------------------------------------------------

同時接続の上限はこの場合 256 になる。

 

問題が起きているときのプロセスの数を確認すると 258 であり、上限を超えている
-------------------------------------------------------------------------------------------
ps aux |grep httpd |wc -l
-------------------------------------------------------------------------------------------

httpd.conf を書き変えて、MaxClientsを増やす。

ServerLimit ディレクティブも同じように増やす必要がある。

ではベストな MaxClients はいくつなのか

MaxClients及びServerLimitのベストな設定値

 

また、ネットワークの状態を確認して、同一ipアドレスから大量のリクエストが来ていないか確認する

コマンド
-------------------------------------------------------------------------------------------
netstat -tpn
-------------------------------------------------------------------------------------------

結果
-------------------------------------------------------------------------------------------
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:52041 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:65281 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:50095 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:62694 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:49490 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:64857 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:57942 SYN_RECV -
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:51261 SYN_RECV -
-------------------------------------------------------------------------------------------
同一ipアドレスからの大量アクセスを確認。

.htaccess を編集して ipアドレスに制限を掛ける

-------------------------------------------------------------------------------------------
#ipアドレスの制限
order allow,deny
allow from all
deny from 154.21.212.○○
-------------------------------------------------------------------------------------------

禁止ipアドレスでアクセスするとcentOS のテストページが表示されてしまうので、forbidden が出るよう設定を変更

参考:https://www.dataplan.jp/blog/server/2089

問題のipアドレスを探す方法として、tcpdump でパケットキャプチャを仕掛けて分析するという方法もあるらしい。

↓サーバーを再起動するとerror_log に残る
-------------------------------------------------------------------------------------------
[Fri Aug 27 02:02:07 2021] [notice] caught SIGTERM, shutting down
-------------------------------------------------------------------------------------------