문제

우리는 SHELL PHP 응용 프로그램 (ExpressionEngine 및 XCART)과 자체 사용자 정의 코드로 구성된 응용 프로그램이 있습니다.

나는 실제 분석을 수행하지 않았으므로 그것이 어떻게 결정되었는지 정확히 알지 못하지만 너무 많은 MySQL 연결이 침착되지 않은 채로 남아 있다는 소식을 듣는 것에 놀라지 않습니다 (DEV에서 중요한 메모리 누출을보고 있기 때문에 놀라지 않습니다. 초기 부팅시 100MB에서 시작하여 하루나 이틀 동안 서버, RAM의 전체 공연이 소비되고 거의 캐시되지 않습니다).

그렇다면 어떤 PHP 코드가 범인인지 정확하게 결정하는 방법은 무엇입니까? 나는 Xdebug에 대한 사전 경험을 얻었으며, 별도의 준비 환경을 합리적으로 안정적으로 얻었을 때 XDEBUG를 개발자로 개조하고 일부 분석을 수행 할 것을 제안했습니다. 이러한 합리적이며/또는 다른 사람이 더 구체적이고 추가 제안이 있습니까?

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다

 SHOW PROCESSLIST  

SQL 명령은 어떤 프로세스가 실행 중인지 확인합니다. 각 프로세스에서 사용중인 사용자 이름, 호스트, 데이터베이스 등을 알려줍니다. 특히 많은 데이터베이스에 액세스 할 수있는 경우 어떤 일이 일어나고 있는지 알 수 있습니다.

여기에 추가 : http://codeinthehole.com/archives/2-Monitoring-mysql-processes.html

다른 팁

MySQL 연결이 자동으로 닫혀 있어야하므로 PHP 코드로 인해 발생하지 않아야합니다.

CF : http://www.php.net/manual/function.mysql-connect.php :

스크립트 실행이 끝나 자마자 서버에 대한 링크는 mysql_close ()를 명시 적으로 호출하여 일찍 닫히지 않는 한 닫힙니다.

몇 가지 제안 :

  • Developer는 기술적으로 생산 MySQL 서버에 직접 액세스 할 수 있습니까? 그렇다면, 아마도 그들은 아마도 그들의 MySQL 관리자를 열어 놓을 것입니다 :)
  • 매일 배치 프로세스가 있습니까? 그렇다면 메모리에 좀비 프로세스가있을 수 있습니다.

PHP는 페이지가 종료되면 MySQL 연결을 자동으로 닫습니다. PHP 웹 애플리케이션이 너무 많이 제거되지 않은 MySQL 연결을 갖는 유일한 이유는 1) 연결 풀링을 사용하거나 2) MySQL 서버 또는 커넥터에 버그가 있습니다.

그러나 코드가 연결되는 위치를 찾기 위해 코드를 실제로보고 싶다면 참조하십시오. http://xdebug.org/docs/profiler

다른 사람들이 말했듯이 PHP는 MySQL 연결을 통해 생성됩니다. mysql_connect 또는 MSQLI/PDO 등가.

그러나 지속적인 연결을 만들 수 있습니다 mysql_pconnect. 기존 연결을 열어두고 사용합니다. 하나를 찾을 수 없다면 새로운 것을 열게됩니다. 한 번에 많은 요청이 있었다면 많은 연결로 인해 열려 있고 열린 상태를 유지할 수 있습니다.

최대 연결 수를 낮추거나 지속적인 연결을 위해 시간 초과를 낮출 수 있습니다. 맨 아래의 의견을 참조하십시오 남자 페이지 자세한 사항은.

나는 스레드 카운트에 대한 Show Status를 폴링하는 스크립트를 실행했으며 mysql_pconnect를 사용하면 항상 많은 수의 스레드를 장려한다는 것을 알았습니다. 연결 속도가 실제로 떨어지는시기를 알 수 없었기 때문에 매우 당황 스러웠습니다. 그래서 mysql_connect ()가 호출 된 모든 장소를 중앙 집중화하고 mysql_pconnect ()를 제거했습니다.

다음으로 한 일은 연결 타임 아웃을보고 30 초로 조정하는 것이 었습니다. 그래서 나는 my.cnf를 조정했습니다

Connect-timeout = 30

그래서 실제로 연결 횟수가 떨어지는 것을 볼 수있었습니다. 열려있는 연결 수를 결정하려면 각각 열린 데이터베이스 연결 수의 시간을 실행하는 Apache 작업자 수에 따라 다릅니다.

내가 시작한 또 다른 일은 Show ProcessList 또는 MyTop에서 쿼리에 메모를 추가하는 것이 었습니다. 결과에 다음과 같은 결과에 노트 열을 추가했습니다.

$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";

이것은 myTop을 보았을 때 쿼리를 발행하는 파일을 보여줄 것입니다.

/* __FILE__.'.'.__LINE__ */ 

쿼리가 시작될 때

나는 일반적인 메모리 문제와 관련하여 MySQL과는 반대로, 특히 우리 자신의 사용자 지정 코드의 맥락에서 볼 수있는 또 다른 몇 가지 일이 있다고 생각합니다. PHP 내장 기능 다음 :

memory_get_usage

memory_get_peak_usage

특히 현재 일부 사용자 정의 코드에서 로깅 작업을하고 있기 때문에 메모리 사용량을 기록하는 동안 메모리 사용을 기록 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top