mysql意外終止問題-2G ram VPS

mysql意外終止問題-2G ram VPS

前幾個月為了使用http2,於是逐步把php網站,從fcgid模式改到php-fpm模式。但後來發現平均兩到三週,mysql會開始突然自己停掉,需要連上主機手動重新啟動。拖了幾個月,最近終於有空來看看是什麼問題。


確認mysql問題

查看 /var/log/syslog 看到mysql是死於記憶體不足(其實事前八成猜到了)。

Nov 14 14:13:54 172-104-93-154 kernel: [2265586.627478] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mariadb.service,task=mariadbd,pid=68249,uid=105
Nov 14 14:13:54 172-104-93-154 kernel: [2265586.630184] Out of memory: Killed process 68249 (mariadbd) total-vm:1163852kB, anon-rss:54696kB, file-rss:0kB, shmem-rss:0kB, UID:105 pgtables:664kB oom_score_adj:0
Nov 14 14:13:54 172-104-93-154 systemd[1]: mariadb.service: A process of this unit has been killed by the OOM killer.
Nov 14 14:13:54 172-104-93-154 systemd[1]: mariadb.service: Main process exited, code=killed, status=9/KILL
Nov 14 14:13:54 172-104-93-154 systemd[1]: mariadb.service: Failed with result 'oom-kill'.
Nov 14 14:13:54 172-104-93-154 systemd[1]: mariadb.service: Consumed 1h 37min 8.512s CPU time.

進一步確認問題

主機記憶體不足時,會調用OOM Killer把耗用記憶體過大的服務終止,以釋放記憶體。但並不代表就是mysql的問題。進一步確認問題,查詢消耗最大的20個項目。

ps auxw|head -1;ps auxw|sort -rn -k4|head -20
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql      915  4.5  2.5 1620704 104524 ?      Sl   Nov23  62:49 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
superme+   961  0.3  2.3 895572 93396 ?        S    Nov23   4:58 php-fpm: pool 16528401783439
superme+  1671  0.3  2.1 657484 88440 ?        S    Nov23   4:55 php-fpm: pool 16528401783439
superme+  1644  0.3  2.1 656796 88748 ?        S    Nov23   4:48 php-fpm: pool 16528401783439
superme+ 14245  0.1  2.1 652576 85500 ?        S    Nov23   2:09 php-fpm: pool 16528401783439
root       430  0.1  1.7 235088 71184 ?        S<s  Nov23   1:22 /lib/systemd/systemd-journald
dewind   20255  0.2  1.6 643672 66000 ?        S    Nov23   0:48 php-fpm: pool 15504071439666
dewind    2706  1.3  1.5 643728 62132 ?        S    Nov23   6:44 php-fpm: pool 15504071439666
dewind    2704  1.3  1.5 644024 62804 ?        S    Nov23   6:45 php-fpm: pool 15504071439666
dewind   23648  0.3  1.5 565748 63664 ?        S    Nov23   0:44 php-fpm: pool 15504071439666
dewind    2708  1.3  1.4 641752 59956 ?        S    Nov23   6:44 php-fpm: pool 15504071439666
root       896  4.2  1.0 1042748 42528 ?       Ssl  Nov23  58:23 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
shanghu    944  0.0  0.9 629396 38392 ?        S    Nov23   0:17 php-fpm: pool 155040869912906
shanghu   2467  0.0  0.9 630472 36636 ?        S    Nov23   0:16 php-fpm: pool 155040869912906
tjdma      947  0.0  0.8 628300 33572 ?        S    Nov23   0:28 php-fpm: pool 155042353621396
tjdma     2804  0.0  0.8 628276 33668 ?        S    Nov23   0:26 php-fpm: pool 155042353621396
tjdma    19267  0.0  0.8 626368 33176 ?        S    Nov23   0:15 php-fpm: pool 155042353621396
t-dima     948  0.0  0.8 554620 32684 ?        S    Nov23   0:06 php-fpm: pool 155042420728162
t-dima    2846  0.0  0.8 628492 32628 ?        S    Nov23   0:06 php-fpm: pool 155042420728162
root       701  0.0  0.7 201380 30864 ?        Ssl  Nov23   0:08 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
root       888  0.0  0.5 423700 20604 ?        Ss   Nov23   0:05 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)

…一堆php-fpm,這就是根源問題了吧。


解決方案

google了一下,解決方案有以下幾種:

  1. 增加記憶體 X 不考慮,這是無底洞
  2. 調整mysql的 oom_score_adj 評分,讓它比較不會被刪除 X 不考慮,看網友講還是會掛掉
  3. 調整php-fpm的產生機制 V 也只有這個可以用

關於php-fpm的調整,有幾種模式,建議可以參考 PHP Process Tuning 這篇文章,寫得很清楚。再來因為我是使用webmin / virtualmin來管理主機,所以參考 PHP-FPM configuration 來變更設定,或是直接修改 /etc/php/7.4/fpm/pool.d/www.conf 。最後我使用以下設定:

pm = ondemand
pm.process_idle_timeout = 20s;

後記

改完後,記憶體的使用量降了一半以上。為什麼我會使用 pm = ondemand 的模式?因為這台主機只有2G的ram,放了5~10個網站,主機日均流量在2000人次左右。所以ondemand就好,瀏覽速度只有剛進網站慢一點點點,也感覺不大出來。

但php-fpm的調整,還是要針對不同主機狀況去處理會比較好。

另外記錄一篇低記憶體主機的優化的設置文章 MySQL memory usage crashing server

註:更多的雲端主機相關文章,請點選尚虎網科-雲端主機

好文分享給朋友

您可能還喜歡...