3

FreeBSD / Apacheシステムで実行されているPerlスクリプトがあり、DBIを介してMySQLデータベースにいくつかの簡単なクエリを実行します。サーバーはかなりアクティブであり(1日15万ページ)、時々(1分に1回程度)何かがプロセスのハングを引き起こしています。ファイルロックが読み取りを保留しているのではないか、SQL呼び出しであるのではないかと疑っていますが、ハングしているプロセスに関する情報を取得する方法を理解できていません。

実用的なmod_perlによると、頭痛の種となる操作を特定する方法は、システムトレース、perlトレース、または対話型デバッガーのいずれかであるように思われます。FreeBSDでシステムトレースがktraceであると収集しましたが、一番上にあるハングしているプロセスの1つに接続すると、プロセスが強制終了された後の唯一の出力は次のとおりです。

50904 perl5.8.9 PSIG  SIGTERM SIG_DFL

それは私にはあまり役に立ちません。誰かがこれについてもっと意味のあるアプローチを提案できますか?私はUnixadminでそれほど進んでいないので、私が愚かに聞こえるならあなたの忍耐は大いに感謝されます....:o)

4

2 に答える 2

0

私が正しく理解していれば、MySQLのクエリ中にPerlプロセスがハングしますが、MySQL自体はまだ機能しています。MySQLサーバーには、そのためのトラブルシューティング機能、log_slow_queriesオプションが組み込まれています。次の行をに入れるとmy.cnf、トリックが有効になります。

[mysqld]
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 10

その後、MySQLデーモンを再起動またはリロードします。サーバーをしばらく実行して統計を収集し、何が起こっているかを分析します。

mysqldumpslow -s at /var/log/mysql/mysql-slow.log | less

私の1つのサーバーでは、トップレコード(-s at平均クエリ時間による注文、ところで)は次のとおりです。

Count: 286  Time=101.26s (28960s)  Lock=14.74s (4214s)  Rows=0.0 (0), iwatcher[iwatcher]@localhost
  INSERT INTO `wp_posts` (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`) VALUES ('S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S')

FWIW、それは30K以上の投稿があるWordPressです。

于 2012-12-23T20:13:26.663 に答える
0

Ktracing は、システム コール、シグナル I/O、namei 処理のみを提供します。そして、大量のデータを非常に迅速に生成します。そのため、トラブル スポットを特定するのは理想的ではないかもしれません。

スクリプトの標準出力を確認できる場合は、戦略的に配置されたいくつかの print ステートメントを、問題が疑われる場所の周りに配置してください。次に、プログラムを実行すると、ハングが発生したことが示されます。

print "Before query X"
$dbh->do($statement)
print "After query X".

標準出力が表示されない場合は、Sys::Syslog perl モジュールなどを使用するか、FreeBSD のlogger(1)プログラムを呼び出してデバッグ情報をログファイルに書き込みます。それをdebug()関数にカプセル化し、代わりにそれを使用するか、ステートメントを出力するのがおそらく最も簡単です。

編集:ディスクに多くのログを記録したくない場合は、ログ情報をソケットに書き込み (Sys::Syslog は でそれをサポートしていますsetlogsock())、別のスクリプトを作成してそのソケットから読み取り、デバッグ テキストを端末にダンプします。データが受信された時刻がプレフィックスとして付けられます。プログラムがハングすると、何をしていたかがわかります。

于 2012-12-23T19:29:40.757 に答える