Optimale l'utilisation de l'UC seuils
J'ai construit le logiciel que j'déployer sur Windows server 2003. Le logiciel s'exécute en tant que service en permanence et c'est la seule application sur le Windows zone d'importance pour moi. Une partie du temps, c'est de la récupération de données à partir d'Internet, et une partie du temps, c'est de faire quelques calculs sur ces données. Il est multi-thread -- je utiliser des pools de threads d'environ 4 à 20 fils.
Je ne vais pas vous ennuyer avec tous ces détails, mais il suffit de dire que, comme je l'activer plus de threads dans la piscine, simultanément davantage de travail se produit, et l'utilisation de l'UC augmente. (comme le fait la demande pour d'autres ressources, comme la bande passante, même si ça n'a pas de souci pour moi, j'en ai beaucoup)
Ma question est: est-ce je devrais simplement essayer de max du CPU pour obtenir le meilleur rendement pour mon argent? Intuitivement, je ne pense pas que cela a du sens pour fonctionner à 100% de CPU de plus de 95% de CPU semble élevé, presque comme si je ne donne pas les OS beaucoup d'espace pour faire ce qu'il doit faire. Je ne sais pas la bonne façon d'identifier les meilleures équilibre. Je deviner j'ai pu mesurer et à mesure et probablement trouver que le meilleur débit est réalisé à un PROCESSEUR avg utilisation de 90% et 91%, etc. mais...
Je me demandais simplement si il y a une bonne règle de pouce à ce sujet??? Je ne veux pas supposer que mon test sera de prendre en compte tous les types de variations de la charge de travail. Je préfère jouer un peu fort, mais pas trop fort (ou autre, je suis underusing mon matériel).
Que recommandez-vous? Qu'est ce qu'une smart, de la performance à l'esprit de la règle de l'utilisation d'un multi-thread, chargement mixte (certains e/S de l'UC) de l'application sur Windows?
OriginalL'auteur kvista | 2010-02-20
Vous devez vous connecter pour publier un commentaire.
Yep, je te suggère de 100% est raclée donc ne veulent pas voir les processus en cours d'exécution comme ça tout le temps. J'ai toujours cherché à 80% pour obtenir un équilibre entre l'utilisation et la salle de pointes /ad-hoc processus.
Une approche que j'ai utilisé dans le passé, c'est d'augmenter la taille du pool lentement et en mesurer l'impact (à la fois sur le CPU et sur d'autres contraintes, telles que IO), vous ne savez jamais, vous pourriez trouver que tout à coup IO devient le goulot d'étranglement.
OriginalL'auteur Toby
L'utilisation de l'UC ne compte pas dans ce i/o de la charge de travail intensif, vous vous souciez de débit, donc essayez d'utiliser un l'escalade approche et, fondamentalement, essayez par programme injection /retrait de threads de travail et de suivi de l'exécution des progrès...
Si vous ajoutez un fil et il permet, en ajouter un autre. Si vous essayez un thread et ça fait mal de le supprimer.
Finalement, cela va se stabiliser.
Si c'est un .NET application, l'escalade a été ajouté à la .NET 4 threadpool.
Mise à JOUR:
l'escalade est une théorie du contrôle d'une approche fondée sur la maximisation du débit, vous pouvez l'appeler d'essai et d'erreur si vous voulez, mais c'est une bonne approche. En général, il n'y a pas une bonne "règle du pouce" à suivre ici parce que les frais généraux et les latences varient beaucoup, ce n'est pas vraiment possible de généraliser. L'accent devrait être mis sur le débit & task /thread achèvement, pas d'utilisation du PROCESSEUR. Par exemple, il est assez facile de peg, les noyaux assez facilement avec grossière ou fine-grain de synchronisation, mais pas réellement faire une différence en termes de débit.
Également en ce qui concerne .NET 4, si vous pouvez recadrer votre problème en Parallèle.Pour ou en Parallèle.ForEach puis le pool de threads va ajuster le nombre de threads afin de maximiser le débit de sorte que vous n'avez pas à vous inquiéter à ce sujet.
-Rick
Il a été dit que l' .NET 4 threadpool fait l'essai et l'erreur automatiquement pour vous. Ce qui est très intéressant si vous êtes.
OriginalL'auteur Rick
En supposant que rien d'autre d'importance, mais le système d'exploitation s'exécute sur la machine:
Et votre charge est constante, vous devriez viser à l'UC à 100%, tout le reste est une perte de CPU. Rappelez-vous le système d'exploitation gère les fils donc il est en effet capable de s'exécuter, il est difficile de mourir de faim l'OS avec une bien comportés programme.
Mais si votre charge est variable et vous vous attendez à des pics, vous devriez prendre en considération, je dirais que 80% de CPU est un bon seuil pour l'utiliser, sauf si vous savez exactement quelle sera la charge varient et combien de CPU, il leur faudra, dans ce cas, vous pouvez viser le nombre exact.
OriginalL'auteur Vinko Vrsalovic
Tout simplement si vous donnez à votre threads de priorité basse, le système d'exploitation fera le reste, et de prendre des cycles comme il a besoin pour faire le travail. Server 2003 (et la plupart des Systèmes d'exploitation de Serveur) sont très bien à ce, pas besoin d'essayer et de le gérer vous-même.
OriginalL'auteur Nick Craver
J'ai également utilisé de 80% en règle générale de pouce pour cible l'utilisation de l'UC. Comme certains l'ont mentionné, ce qui laisse de la place pour sporadiques pics d'activité et permettra d'éviter la surcharge sur le CPU.
Ici est un peu (vieux mais toujours pertinents), les conseils de la Weblogic équipage sur cette question: http://docs.oracle.com/cd/E13222_01/wls/docs92/perform/basics.html#wp1132942
Si vous sentez que votre charge est très régulière et prévisible de pousser qui cible un peu plus élevé, mais si votre base d'utilisateurs est extrêmement tolérants de périodique des réponses lentes et votre projet de budget est incroyablement serré, je vous recommande l'ajout de plus de ressources de votre système (ajout d'un PROCESSEUR, l'utilisation d'un CPU avec plus de cœurs, etc.) en faisant un geste risqué pour essayer de faire sortir un autre 10% d'utilisation du PROCESSEUR de votre plate-forme existante.
OriginalL'auteur rscarter