速度を上げるためにApacheとmod_phpを使用してWebサーバーでMySQLを調整しているので、mysqltunerを実行しました。結果は次のとおりです。
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.1.63-0+squeeze1
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 255M (Tables: 120)
[--] Data in InnoDB tables: 5M (Tables: 2)
[!!] Total fragmented tables: 14
-------- Security Recommendations -------------------------------------------
ERROR 1142 (42000) at line 1: SELECT command denied to user 'lovecpokladu'@'localhost' for table 'user'
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 9h 37m 22s (6M q [185.754 qps], 286K conn, TX: 72B, RX: 767M)
[--] Reads / Writes: 85% / 15%
[--] Total buffers: 58.0M global + 2.7M per thread (151 max threads)
[OK] Maximum possible memory usage: 463.8M (11% of installed RAM)
[OK] Slow queries: 0% (105/6M)
[OK] Highest usage of available connections: 33% (50/151)
[OK] Key buffer size / total MyISAM indexes: 16.0M/48.9M
[OK] Key buffer hit rate: 99.9% (378M cached / 497K reads)
[OK] Query cache efficiency: 83.2% (4M cached / 5M selects)
[!!] Query cache prunes per day: 84442
[OK] Sorts requiring temporary tables: 6% (10K temp sorts / 159K sorts)
[!!] Joins performed without indexes: 403
[OK] Temporary tables created on disk: 25% (79K on disk / 312K total)
[OK] Thread cache hit rate: 99% (936 created / 286K connections)
[!!] Table cache hit rate: 0% (64 open / 102K opened)
[OK] Open file limit used: 10% (106/1K)
[OK] Table locks acquired immediately: 99% (1M immediate / 1M locks)
[!!] Connections aborted: 49%
[OK] InnoDB data size / buffer pool: 5.6M/8.0M
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
Enable the slow query log to troubleshoot bad queries
Adjust your join queries to always utilize indexes
Increase table_cache gradually to avoid file descriptor limits
Your applications are not closing MySQL connections properly
Variables to adjust:
query_cache_size (> 16M)
join_buffer_size (> 128.0K, or always use indexes with joins)
table_cache (> 64)
私のPDO初期化スクリプト:
$pdo = new PDO("mysql:Host=localhost;dbname=...;charset=utf8", $user, $pass, array("SET NAMES utf8"));
$pdo->exec("SET CHARACTER SET utf8");
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
[!!] Connections aborted: 49%
、心配する必要がありますか? PHPからデータベースへの非永続的な接続にはPDOを使用します。スクリプトの最後で接続を閉じる必要があります。そうすることで、このような高い接続アボートの理由がわかりません。またはそれが実際に重要であっても。
どうもありがとう!
Mysqlクライアント(この場合、PHPスクリプト))が終了前にmysql_closeの実行に失敗した場合、MySQLは中止された接続をログに記録し、中止されたクライアントのステータス変数を増やします。
MySQLドキュメントから: 通信エラーと接続の中止
クライアントが正常に接続したが、後で不適切に切断するか終了した場合、サーバーはAborted_clientsステータス変数をインクリメントし、Aborted接続メッセージをエラーログに記録します。原因は次のいずれかです。
The client program did not call mysql_close() before exiting. The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server. See Section 5.1.4, “Server System Variables”.
私はPHPプログラマではありませんが、MySQL接続を適切に閉じない場合、MySQLログでこれらのメッセージを確認できることをsysadmin側で作業していることがわかります。
また、ドキュメントから: 接続と接続管理
データベースへの接続が成功すると、PDOクラスのインスタンスがスクリプトに返されます。接続は、そのPDOオブジェクトの存続期間中アクティブのままです。接続を閉じるには、オブジェクトへの残りの参照をすべて削除して、オブジェクトを破棄する必要があります。これを行うには、オブジェクトを保持する変数にNULLを割り当てます。これを明示的に行わない場合、PHPは、スクリプトの終了時に接続を自動的に閉じます。
できるだけ早く接続を閉じる
実際には、MySQL接続が終了したらすぐに明示的に閉じることをお勧めします。
次のような高負荷状態で想像してみてください。
このシナリオでは、負荷が高いためにPHPコードの実行に5秒かかる場合、MySQL接続は開いたままになります。これに1000リクエスト/秒を掛けると、MySQL接続が簡単に使い果たされます。閉じることで明示的に接続すると、この問題やその他の問題を回避するのに役立ちます。