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?
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. –