Memo

メモ > サーバ > 各論: トラブル対応例 > サーバが重い・サーバに繋がらない 3

■サーバが重い・サーバに繋がらない 3
ブラウザから見て画面が表示されないという連絡 topで確認すると、MySQLのプロセス1つがCPU使用率100%になっていた Zabbixで確認すると全体の25%を使用している CPUのコア数は4なので、CPUを1つ使い切っている。重い処理が1つ走った可能性がある また、ロードアベレージも1〜3程度まで上昇し、メモリもfreeが普段の半分くらいになっている スロークエリを確認(ファイルに記録している場合。以下の場所は一例)
# vi /var/log/slow.log # vi /var/lib/mysql/mysql-slow.log
ログが見当たらない場合、/etc/my.cnf の設定を確認するか、ファイルを検索する
# find / -name mysql-slow.log /home/www/html/logs/mysqld/mysql-slow.log /home/www/html/logs/mysql-slow.log /home/admin/mysql-slow.log # vi /home/www/html/logs/mysqld/mysql-slow.log
スロークエリを確認(データベースに記録している場合)
SELECT * FROM mysql.slow_log;
以下のクエリが実行された以降、重くなった?
# Time: 160205 10:17:08 # User@Host: refirio[refirio] @ localhost [] # Query_time: 2427.133555 Lock_time: 0.000157 Rows_sent: 0 Rows_examined: 9586647062 SET timestamp=1454635028; CREATE TEMPORARY TABLE `dataC6` (INDEX(owner_cd)) SELECT Q.owner_cd, Q.wms_section_cd, COUNT(Q.arrival_no) AS 'cntWork', SUM(Q.list_sum) as cntWorkd FROM (SELECT mag.area_group, mag.area_group_name, mo.owner_name, ah.owner_cd, ah.wms_section_cd, ah.arrival_no, ah.regist_date, ah.reserve_date, SUBSTRING(ah.regist_date,1,10) AS date , GET_SUM_ITEM_NUM_BY_ARRIVAL_LIST(ah.arrival_no) AS 'list_sum' FROM w_arrival_reserve_list ah LEFT JOIN m_owner mo ON ah.owner_cd = mo.owner_cd LEFT JOIN m_area ma ON mo.area_cd = ma.area_cd LEFT JOIN m_area_group mag ON ma.area_group = mag.area_group WHERE ah.regist_date between '2011-01-01 00:00:00' and '2016-02-05 23:59:59' AND not exists(select 1 from w_arrival_result ar where ah.arrival_no = ar.arrival_no) AND ah.csv_status<>'0' AND mo.area_cd IN (SELECT m_area.area_cd as area_cd FROM m_area WHERE m_area.area_group = 32 ) GROUP BY ah.arrival_no ) Q GROUP BY Q.area_group ASC, Q.owner_cd ASC;
また、以下の様な処理が何度もスロークエリに記録されている
SELECT COUNT(*) as cnt FROM w_delivery_call_list target INNER JOIN w_delivery_call_header dh ON target.delivery_no = dh.delivery_no AND target.owner_cd = dh.owner_cd INNER JOIN m_owner_wms_section ow ON target.owner_cd = ow.owner_cd AND target.wms_section_cd = ow.wms_section_cd WHERE ow.area_cd = 'HN1' AND target.ignore_flg <> '1' AND NOT EXISTS(SELECT * FROM w_delivery_call_list dl INNER JOIN t_item ti ON dl.owner_cd = ti.owner_cd AND dl.wms_section_cd = ti.wms_section_cd AND dl.wms_item_cd = ti.wms_item_cd INNER JOIN m_owner_wms_section ow ON dl.owner_cd = ow.owner_cd AND dl.wms_section_cd = ow.wms_section_cd WHERE dl.stockout_flg = '1' AND dl.picking_flg = '1' AND dl.delivery_no = target.delivery_no AND (ti.uninventory_flg <> '1' AND ti.uninventory_flg <> '3') AND ow.area_cd = 'HN1')AND dh.shipment_start_date <= DATE_ADD(CURDATE(), INTERVAL 10 DAY) + 0 AND target.csv_status = 0;
ログイン時、もしくはダッシュボードで常に重い処理が走っているみたい 普段から重いが、MySQLが重くなると致命的になる? プログラム側の改修が必要の可能性あり 以下のSQLで、60秒より長く実行され続けているクエリを探すこともできる
SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60;

Advertisement