Drupalでクエリ/ビューを実行しているユーザーに問題があり、サイトがフリーズすることがあります。フリーズが発生するのは、クエリによってデータベース接続の数が400以上になり、基本的にはいつでも発生するためです。サイトが100を超えるデータベース接続を行った場合、サイトの速度が大幅に低下し、応答しなくなります。
MySQL Red Hat Linuxを使用してAmazon RDSを実行しています
フロントエンドアプリサーバーには十分な大きさのEC2があり、十分な大きさのRDSがあります。
この問題を修正する方法は、問題のあるクエリを見つけて強制終了することです。クエリが強制終了されると、データベース接続は約20に低下します。これは、サイト統計を監視するときに表示される通常の量です。
問題のあるクエリを停止し、実行時間が長すぎて接続を消費する前にそれを強制終了する方法はありますか?不正なクエリが発生する前にそれを自動的に強制終了するか、少なくとも30秒後に不正なクエリを認識して強制終了します。
長時間実行されているSELECTを強制終了するストアドプロシージャを次に示します
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`Kill_Long_Running_Selects` $$
CREATE PROCEDURE `test`.`Kill_Long_Running_Selects` (time_limit INT,display INT)
BEGIN
DECLARE ndx,lastndx INT;
DROP TABLE IF EXISTS test.LongRunningSelects;
CREATE TABLE test.LongRunningSelects
(
id INT NOT NULL AUTO_INCREMENT,
idtokill BIGINT,
PRIMARY KEY (id)
) ENGINE=MEMORY;
INSERT INTO test.LongRunningSelects (idtokill)
SELECT id FROM information_schema.processlist
WHERE user<>'system user' AND info regexp '^SELECT' AND time > time_limit;
SELECT COUNT(1) INTO lastndx FROM test.LongRunningSelects;
SET ndx = 0;
WHILE ndx < lastndx DO
SET ndx = ndx + 1;
SELECT idtokill INTO @kill_id
FROM test.LongRunningSelects WHERE id = ndx;
CALL mysql.rds_kill(@kill_id);
END WHILE;
IF lastndx > 0 THEN
IF display = 1 THEN
SELECT GROUP_CONCAT(idtokill) INTO @idlist FROM test.LongRunningSelects;
SELECT @idlist IDs_KIlled;
SELECT CONCAT('Processes Killed : ',lastndx) Kill_Long_Running_Selects;
END IF;
END IF;
END $$
30秒より長く実行されているSELECTを強制終了するには、これを実行します
CALL test.Kill_Long_Running_Selects(30,0);
接続が強制終了されていることを確認したい場合は、これを実行します
CALL test.Kill_Long_Running_Selects(30,1);
おそらく、MySQLイベントを作成して、このストアドプロシージャを毎分呼び出すことができます。
Amazonが [〜#〜] event [〜#〜] 権限を許可しない場合、DBに接続してStoredを実行するには、EC2サーバーで外部シェルスクリプトを作成する必要があります手順。そのシェルスクリプトはcrontabに入れることができます。
Amazonが [〜#〜] process [〜#〜] および [〜#〜] super [〜#〜] 権限を許可していない場合は、これを行うには、DBをRDSからMySQLを実行している別のEC2インスタンスに移動します。その後、Amazonのホスティング制限なしでMySQLイベントを作成できます。