2010-08-24 7 views
8

몇 가지 CPU 문제가있는 토네이도 응용 프로그램에서 작업하기 시작했습니다. CPU 시간은 시간이 지남에 따라 단조롭게 증가하여 CPU를 100 %로 최대화합니다. 시스템은 현재 주 스레드를 차단하지 않도록 설계되었습니다. 차단해야하는 작업이 필요한 경우 비동기 드라이버를 사용할 수 없으면 차단 작업을 수행 할 다른 스레드가 생성됩니다.적절한 체크 간격은 어떻게 결정합니까?

따라서 우리는 거의 모든 CPU- 바운드와 거의 모든 IO- 바운드 인 다른 스레드를 가지고 있습니다. 내가 읽은 것에서 이것은 GIL에 문제가 생기는 완벽한 방법 인 것 같습니다. 게다가, 필자의 프로파일 링은 우리가 신호를 기다리는 데 많은 시간을 소비하고 있음을 보여줍니다. (이것은 __semwait_signal이 수행하는 것으로 가정합니다.) 이는 제한된 이해에서 GIL이 갖는 효과와 일치합니다.

sys.setcheckinterval을 사용하여 검사 간격을 300으로 설정하면 CPU 속도가 크게 느려집니다. 내가 결정하려고하는 것은 체크 간격을 늘려야할지, 아니면 300으로 남겨 두어야하는지, 아니면 그것을 올리면 겁나는가하는 것이다. 결국, 나는 CPU 성능이 나아 졌음을 알았지 만, 이것이 시스템의 응답성에 부정적인 영향을 미칠지는 조금 걱정된다.

물론 올바른 대답은 Google에서 GIL을 고려하기 위해 아키텍처를 다시 생각해야한다는 것입니다. 그러나 그것은 즉시 할 수있는 것이 아닙니다. 그렇다면 단기간에 취할 수있는 적절한 행동 방침을 어떻게 결정할 수 있습니까?

답변

1

내가 제일 먼저 확인해야 할 것은 스레드를 제대로 종료하고 있는지 확인하는 것입니다. 여러분의 설명만으로는 어떤 일이 벌어지고 있는지 알아내는 것은 매우 어렵습니다.하지만 "단조롭게 (monotonically)"라는 말을 사용합니다. 이는 CPU 사용이 적재보다는 시간에 묶여 있음을 의미합니다.

파이썬의 스레딩 제한에 잘 들어갈 수는 있지만 스레드가 종료 될 때로드 (활성 스레드 수)와 CPU 사용량 (컨텍스트 전환 비용)에 따라 위아래로 달라질 수 있습니다. 한 번 생성 된 스레드가 영원히 살 수있는 이유가 있습니까? 그렇다면 재구성을 우선시하십시오. 그렇지 않으면 단기간에 CPU 사용량이 시간에 종속되어로드되지 않는 이유를 파악해야합니다. 새로운 쓰래드마다 시스템에 영구적 인 돌이킬 수없는 비용이 있다는 의미입니다.

+0

스레드가 제대로 종료되고 있다고 확신합니다. 또한,로드 하에서 약간의 성능 차이를보고 있습니다. 부하로 인해 CPU 시간이 더 빨리 증가하게됩니다. –

관련 문제