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了一下,解決方案有以下幾種:
- 增加記憶體 X 不考慮,這是無底洞
- 調整mysql的 oom_score_adj 評分,讓它比較不會被刪除 X 不考慮,看網友講還是會掛掉
- 調整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
註:更多的雲端主機相關文章,請點選尚虎網科-雲端主機