2010-07-11 4 views
3

Salutations.Recherche des goulots d'étranglement du multithreading .NET

J'ai une application .NET qui exécute un tas de simulations en parallèle. Il effectue un balayage de paramètres, de sorte que chaque paramètre possède sa propre boucle Parallel.Foreach. Normalement, je mets le parallélisme max à un dans toutes les boucles, sauf une, pour réduire les besoins en mémoire, puisque chaque paramètre peut prendre plus de valeurs que j'ai de cœurs disponibles (4).

L'application est totalement liée à l'UC et ne fait qu'E/S à la fin pour écrire les résultats. J'ai seulement un verrou autour de la structure de données capturant les résultats, mais on y accède très rarement (une fois toutes les quelques secondes). Peu importe jusqu'où je pousse le parallélisme (en contrôlant le parallélisme maximum sur les boucles), j'obtiens toujours une utilisation moyenne du CPU d'environ 50% (~ 2 cœurs).

Je voudrais savoir ce qui empêche une utilisation plus élevée du processeur. Mes suppositions sont: 1) certains appels aux bibliothèques .NET qui sont synchronisés, sérialisant ainsi les appels. 2) Le GC intervient pour nettoyer les ressources (il y a beaucoup de déchets produits par l'application).

Des idées sur la façon de mener l'enquête?

Merci beaucoup.

Répondre

2

Je pense que le débogage de problèmes de multithreading nécessite toujours des connaissances sur les détails du code, donc il n'y a pas de recette générale. Mais je pense que le GC est une très bonne première idée. Avez-vous déjà essayé celui-ci:

http://msdn.microsoft.com/en-us/library/ms229357.aspx

J'ai eu un problème similaire et en utilisant gcServer lui a permis de pousser les CPU (8 cœurs) à ses limites.

+0

Wow. Cela seul pousse l'utilisation du CPU jusqu'à 75%. La mémoire semble être stable. Garder un oeil dessus. Merci! – Mau