2010-08-24 25 views
8

Je commence juste à travailler sur une application de tornade qui a quelques problèmes de CPU. Le temps CPU augmentera de manière monotone au fil du temps, maximisant le CPU à 100%. Le système est actuellement conçu pour ne pas bloquer le thread principal. S'il a besoin de faire quelque chose qui bloque et que les pilotes asynchrones ne sont pas disponibles, il va générer un autre thread pour faire l'opération de blocage.Comment déterminer l'intervalle de vérification approprié?

Ainsi, le thread principal est presque entièrement lié au CPU et un tas d'autres threads sont presque totalement liés à l'E/S. D'après ce que j'ai lu, cela semble être le moyen idéal pour rencontrer des problèmes avec le GIL. De plus, mon profilage montre que nous passons beaucoup de temps à attendre sur les signaux (ce que je suppose est ce que fait __semwait_signal), ce qui est cohérent avec les effets que le GIL aurait dans ma compréhension limitée.

Si j'utilise sys.setcheckinterval pour définir l'intervalle de vérification sur 300, la croissance de l'UC ralentit considérablement. Ce que j'essaie de déterminer, c'est si je devrais augmenter l'intervalle de vérification, le laisser à 300, ou avoir peur de l'augmenter. Après tout, je remarque que les performances du processeur s'améliorent, mais je crains que cela n'affecte négativement la réactivité du système.

Bien sûr, la réponse correcte est probablement que nous devons repenser notre architecture pour prendre en compte le GIL. Mais ce n'est pas quelque chose qui peut être fait immédiatement. Alors, comment puis-je déterminer la ligne de conduite appropriée à prendre à court terme?

Répondre

1

La première chose que je vérifierais serait de s'assurer que vous sortez correctement les threads. Il est très difficile de comprendre ce qui se passe avec seulement votre description, mais vous utilisez le mot «monotone», ce qui implique que l'utilisation du processeur est liée au temps plutôt qu'au chargement. Il se peut que vous utilisiez des limites de Python, mais il devrait varier en fonction de la charge (nombre de threads actifs) et de l'utilisation de l'UC (coûts de changement de contexte) à la fin de ces threads. Y a-t-il une raison pour qu'un fil, une fois créé, vive pour toujours? Si c'est le cas, donnez la priorité à cette architecture de recherche. Autrement, à court terme serait de comprendre pourquoi l'utilisation de l'unité centrale est liée au temps et non au chargement. Cela implique que chaque nouveau thread a un coût permanent et irréversible dans votre système, ce qui signifie qu'il ne sort jamais.

+0

Je suis sûr que les threads sont correctement supprimés. De plus, je vois une différence de performance sous charge. C'est juste que la charge augmente le temps CPU. –