mysql 停止服务内存_服务器莫名的内存高占用 导致 MySQL 停止运行问题
這問題是年后開始出現的,服務器內存占用越來越高,一度達到90%,最后 MySQL 都停止運行了。貼吧簽到的數據庫用戶 ID 這一項也丟失了,導致無法簽到,斷簽了好些天,被提醒才發現,要挨打的。幸好設置了自動備份,把數據恢復,然后提高了簽到頻率,沒想到后邊反復出現了幾次,不得不重視。
出現了幾次就不是偶然了,最后每次都飆到85%,只能重啟服務器解決。第一次出現時以為是 MySQL 數據庫的自身問題,可能因服務器內存小而崩潰,實際1.8G 的運行內存不大不小的。查了數據庫日志發現數據庫因分配內存不足而啟動失敗,用 top 命令也查了下,內存高占用的前 20 有 MySQL,是個大頭,于是添加了 2G 的 Swap 虛擬內存,再添加了數據庫進程守護,計劃任務每5分鐘運行一次,檢測到 MySQL 不運行了就重新啟動。pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ];then
bash /www/server/panel/script/rememory.sh
/etc/init.d/mysqld start
fi
結果過了些天問題依舊出現了,4G 內存也不夠耗。這就有點莫名其妙的,之前一直運行好幾年穩如狗的,怎么突然就這樣呢?回想一下自己的操作,除了升級高版本寶塔面板好像就沒了,升個大版本應該不會突然占用飆升吧,查進程看面板占用也才幾十 MB ,到論壇也沒見有人反饋,說明不是這個原因。
最后用 ps 命令仔細查看了所有進程,終于發現了問題的源頭,是貼吧簽到的定時任務和 php-fpm 。如果需要不間斷地自動簽到,那就得不停地訪問執行簽到的 do.php 頁面。進程中發現了幾十個正在運行的 do.php 和php-fpm 進程。
原來設置的是一分鐘執行一次的 crontab ,后來似乎是嫌簽到太慢,我就就按著查到的方法改為 10 秒執行簽到一次:php /www/wwwroot/qiandao/do.php
sleep 10;
php /www/wwwroot/qiandao/do.php
sleep 20;
php /www/wwwroot/qiandao/do.php
sleep 30;
php /www/wwwroot/qiandao/do.php
sleep 40;
php /www/wwwroot/qiandao/do.php
sleep 50;
php /www/wwwroot/qiandao/do.php
面板提供的計劃任務功能最小只能 N 分鐘執行,就查了下,了解到可以用 sleep 來實現。雖然知道在 C++ 程序中長時間延遲不能用 sleep ,都是用不會導致程序假死阻塞的定時器,但在這計劃任務中PHP用應該沒問題吧?還是 to young to simple 了,去除 sleep ,改回一分鐘執行一次,重啟服務器,再也沒出現內存爆滿的問題了,回到了以前正常占用內存60%左右。
最開始只用了 top 查內存高占用的前 20 進程,所以沒發現是 do.php 和 php-fpm 的原因。一個進程只占了不到 9 mb ,雖然PHP管理中限制了 php-fpm 最大子進程數是50個,但到50個后,do.php 進程也達到 50 ,兩個加起來占用就飆到 900 MB 了,妥妥地爆滿。
正常我的網站 PHP 需求 是不會產生幾十個進程的,是使用 sleep 導致了這個問題。原因大概是采用 FPM 管理 PHP 進程,由于 sleep 導致阻塞等待,FPM 實際分配了過多子進程,然后我的 PHP 并發方案是設置的 2G ,問題就這么產生了。
總結:編程不專業,程序兩行淚。
總結
以上是生活随笔為你收集整理的mysql 停止服务内存_服务器莫名的内存高占用 导致 MySQL 停止运行问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LInux:shell 命令:字符串截取
- 下一篇: AD域账户登录mysql_ASP.NET