SQL 쿼리 오버로드 서버

SQL 쿼리 오버로드 서버

외부 응용 프로그램의 세션 확인을 위해 매우 자주 호출되는 PHP 파일이 하나 있습니다. 1초에 몇 번의 호출이 있는지는 모르겠지만, 1초에 20~100번 정도 호출될 수 있을 것 같아요.

그러나 이 .php 파일에는 단일 행을 업데이트하는 하나의 SQL 쿼리가 포함되어 있습니다. 이 줄을 주석 처리하지 않으면 전체 데이터베이스 속도가 많이 느려지고 결국 내 포럼에 더 이상 접근할 수 없게 됩니다. 제 생각에는 서버 문제(예: 많은 IOPS?)와 비슷한 것 같습니다. 불행하게도 속도 저하의 정확한 원인을 어떻게 찾을 수 있는지, PHP 파일에 대해 매초마다 몇 건의 호출이 들어오는지 어떻게 확인할 수 있는지 모르겠습니다.

이것은 매우 간단한 SQL 쿼리입니다(where 절에는 기본 키만 포함됨).

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

두 가지 질문이 있습니다.

  1. 내 특정 PHP 파일이 매초 얼마나 자주 호출되는지 어떻게 알 수 있나요?
  2. 이 업데이트 쿼리를 사용한 후 전체 데이터베이스 속도가 느려지는 이유를 어떻게 찾을 수 있습니까?

답변1

웹 서버 로그를 살펴보면 특정 PHP 파일이 얼마나 자주 호출되는지 알 수 있습니다. 몇 가지 다른 해킹 방법이 있습니다. 예를 들어 Google Analytics 사용(정확도가 낮음) 또는 파일/카운터 업데이트(리소스 집약적) 등이 있습니다.

@ma.tome이 말했듯이 사용률을 모니터링하면 시작하기에 좋은 위치를 제공하며 일반적으로 유용합니다. 135%에서 실행되는 Mysql 프로세스는 1개 이상의 CPU를 사용한다는 의미입니다. (CPU가 4개 있는 경우 총합은 400%입니다.) vmstat를 실행하면 IO 정보가 제공됩니다.

또 다른 방법은 데이터베이스에 쿼리 시간 기록을 시작하는 것입니다. 또한 인덱스를 확인하세요. 애플리케이션에 따라 아직 인덱스가 생성되지 않은 경우 bot_sessions에 사용자 이름에 대한 인덱스를 생성하면 성능이 크게 향상될 수 있습니다. (username 또는 session_token이 지정하는 기본 키인지 확실하지 않으면 기본 키가 아닌 인덱스를 생성하는 것이 좋습니다.) - 어느 쪽이든 where 절에는 기본 키보다 더 많은 것이 포함됩니다.

또한 시스템에 RAM이 부족할 수도 있습니다. 사용 중인 스왑 양을 확인하고 필요한 경우 문제에 더 많은 RAM을 사용하거나 vm.swappiness를 줄이세요.

관련 정보