4

내 응용 프로그램 중 하나가 약 100 명의 작업자를 실행합니다. 그것은 threading 응용 프로그램으로 시작되었지만 성능 (대기 시간) 문제가 발생했습니다. 그래서 나는 그 노동자들을 multiprocessing.Process es로 바꾸었다. 아래의 벤치 마크는 더 많은 메모리 사용량 (요인 6)의 비용으로로드 감소가 달성되었음을 보여줍니다.다중 처리로 메모리 사용 공간 축소?

그렇다면 Linux가 소를 사용하고 작업자가 데이터를 공유하지 않는 경우 정확히 어디에서 메모리 사용량이 발생합니까?

메모리 풋 프린트를 어떻게 줄일 수 있습니까? (대체 질문 : 어떻게 threading에 대한 부하를 줄일 수있다?)

리눅스 2.6.26, 4 개의 CPU 2G에 대한 벤치 마크 RAM : (즉, CPU 사용은 하나 개의 CPU의 %에 주어진, 그래서 전체 부하가 400 %입니다 참고 . 숫자는 Munin 그래프보고에서 파생 된)

    | threading | multiprocessing 
------------------+-----------+---------------- 
memory usage  | ~0.25GB | ~1.5GB 
context switches | ~1.5e4/s | ~5e2/s 
system cpu usage | ~30%  | ~3% 
total cpu usage | ~100%  | ~50% 
load avg   | ~1.5  | ~0.7 

배경 :. 응용 프로그램이 네트워크에서 이벤트를 처리하고 MySQL 데이터베이스에 그 중 일부를 저장한다.

답변

3

필자는 파이썬과 같은 동적 언어의 경우 복사 후 기록이 더 많은 메모리가 포킹 후에 쓰여지는 (따라서 복사되기 때문에) 효과가 없다고 생각합니다. 파이썬 해석기가 프로그램을 진행함에 따라 코드보다 훨씬 더 많은 작업이 진행됩니다. 예를 들어 레퍼런스 카운팅 (reference counting) - 레퍼런스 카운트가 메모리에 참조 카운트를 기록 (복사본을 트리거링)해야하므로 너무 빠르게 객체가 너무 빨리 기록됩니다.

염두에두고 하이브리드 스레딩/처리 방법이 필요합니다. 다중 코어 등을 활용하는 여러 프로세스가 있지만 각 스레드마다 여러 스레드를 실행하게하십시오 (필요한 동시성 수준을 처리 할 수 ​​있도록). 실행하는 프로세스 대 스레드 수를 실험 해보십시오.

관련 문제