SQLクエリの過負荷サーバー

SQLクエリの過負荷サーバー

外部アプリケーションのセッション チェックのために頻繁に呼び出される PHP ファイルが 1 つあります。1 秒あたりの呼び出し回数はわかりませんが、1 秒あたり 20 ~ 100 回程度だと思います。

ただし、この .php ファイルには、1 行を更新する 1 つの SQL クエリが含まれています。これらの行をコメントアウトしないと、データベース全体の速度が大幅に低下し、最終的にはフォーラムにアクセスできなくなります。サーバーの問題 (たとえば、IOPS が多すぎるなど) のようなものだと思います。残念ながら、速度低下の正確な原因を特定する方法も、php ファイルに対して 1 秒あたりに何回の呼び出しが行われるかを判断する方法もわかりません。

これは非常に単純な SQL クエリです (where 句には主キーのみが含まれます)。

UPDATE bot_sessions SET ip_address = :ip_address, renewal_count = renewal_count + 1
       WHERE username = :username AND session_token = :session_token

そこで2つの質問です:

  1. 特定の PHP ファイルが毎秒どのくらいの頻度で呼び出されているかを知るにはどうすればよいですか?
  2. この更新クエリを使用するとデータベース全体の速度が低下する原因をどのように特定すればよいでしょうか?

答え1

Web サーバーのログを調べることで、特定の PHP ファイルがどのくらいの頻度で呼び出されているかを知ることができます。他にも、Google Analytics を使用する (精度は低くなります)、ファイル/カウンターを更新する (リソースを大量に消費します) などのハックがあります。

@ma.tome が言ったように、使用率を監視することは良い出発点となり、一般的に役立ちます。Mysql プロセスが 135% で実行されている場合、1 つ以上の CPU を使用していることを意味します (CPU が 4 つある場合、合計は 400% になります)。vmstat を実行すると、IO 情報が得られます。

他に実行すべきことは、データベースのクエリ時間のログ記録を開始することです。また、インデックスを確認してください。アプリケーションによっては、まだインデックスが作成されていない場合は、bot_sessions でユーザー名のインデックスを作成することで、パフォーマンスが大幅に向上する可能性があります。(指定する主キーがユーザー名または session_token のどちらであるかは不明ですが、主キーではない方にインデックスを作成することを検討してください)。いずれにしても、where 句には主キー以外のものも含まれています。

また、システムの RAM が不足している可能性もあります。使用しているスワップの量を確認し、必要に応じて問題の解決に RAM を追加するか、vm.swappiness を減らしてください。

関連情報