2010-01-16 2 views
2

약 15k 회 반복되는 루프 for 루프가있는 스크립트가 있습니다. 이 루프에서는 로컬 MySQL 데이터베이스를 쿼리하고 로컬 저장소에서 SVN 업데이트를 수행합니다. 나는 대부분의 시간이 디스크 읽기/쓰기에 소비 된 것처럼 보였던 것처럼 RAM 디스크에 SVN 저장소를 배치했습니다.파이썬 및 MySQL 스크립트에서 성능 병목 현상 찾기

이제 스크립트는 기본적으로 동일한 속도로 실행되지만 스크립트의 CPU 사용률은 10 %를 넘지 않습니다.

ProcessExplorer는 mysqld가 거의 모든 CPU 시간을 사용하거나 디스크에 많은 양의 읽기/쓰기 작업을 수행하지 않는다는 것을 보여줍니다.

어디에서 병목 현상이 발생했는지 파악하려면 어떤 단계를 밟아야합니까?

답변

4

.. 15K 시간은 모든 언어에서 병목 for 루프에서 SQL 쿼리를 수행

은 다시 때마다 쿼리 어떤 이유가 있나요? for 루프 전에 단일 쿼리를 수행 한 다음 결과 집합과 SVN 부분을 반복하면 속도가 크게 향상됩니다.

그러나 더 높은 CPU 사용량을 얻게 될지는 의심 스럽습니다. 그 이유는 계산을하지 않고 있지만 대부분 IO 때문입니다. Btw, 당신은 실제 코드에서 쿼리의 복잡성이 아니기 때문에 mysqld cpu 사용량을 측정 할 수는 없지만, 그 개수와 응답 할 서버 엔진의 대기 시간이 중요합니다. 그렇기 때문에 시간이 많이 걸리는 매우 짧고 비싼 쿼리 만 볼 수 있습니다.

1

프로필 파이썬 코드. 각 함수/메서드 호출이 얼마나 오래 걸리는지 보여줍니다. 그것이 MySQL 데이터베이스를 쿼리하는 메서드 호출이라면, 어디에서보아야하는지 알 수 있습니다. 그러나 그것은 또한 다른 것일 수도 있습니다. 어쨌든 프로파일 링은 이러한 문제를 해결하기위한 일반적인 접근법입니다.

+0

나는 당신 덕분에 프로파일 링하는 법을 배웠지 만, 내가 얻은 결과는 결정적이지 못했다. (또는 나는 여전히 해석법을 모른다.) – greye

1

말하자면, svn update은 실행이 끝난 후 최대 두 번째까지 대기하므로 파일 수정 타임 스탬프는 "과거에"발생합니다 (많은 파일 시스템에는 타임 스탬프가 없기 때문에). 1 초보다 미세한 입도). "svn sleep_for_timestamps"에 대한 인터넷 검색을 통해 자세한 정보를 찾을 수 있습니다.

제안할만한 해결책이 없습니다. 이것이 정말로 중요한 성능이라면 다음과 같이 할 수 있습니다 : 1) 당신이하고있는 것처럼 자주 업데이트하지 마십시오 2) 더 낮은 수준의 Subversion API (행운을 빌어 요)를 사용하십시오.

관련 문제