2014-05-13 6 views
3

J'ai une attente sans mise en œuvre pour les arbres binaires de recherche, mais je ne suis pas en mesure de comprendre les méthodes concrètes pour mesurer les conflits de fil. Par contention, je veux dire ici le nombre de threads qui tentent d'accéder au même morceau de mémoire en même temps.Mesure contention dans l'attente sans programmes Java multi-thread

Jusqu'à présent, j'ai recherché la classe ThreadMXBean et ThreadInfo, mais comme il n'y a pas de serrures en cause, je n'ai pas encore trouvé de solution.

+0

Il suffit de regarder combien de temps processeur est utilisé par la méthode effectuant la mise à jour simultanée. Sans contention, un CAS ne prend presque pas de temps ... – Holger

+0

J'ai mesuré le temps processeur par thread, mais cela ne semble pas me donner une idée de la contention. Mais votre commentaire m'amène à une manière intéressante de mesurer la contention. La différence entre le temps CPU maximum et minimum devrait me donner une idée du délai qui est invariablement dû à la contention! – grillSandwich

+0

Le point clé des algorithmes * lock free * (alias * wait free *) est qu'ils n'incluent pas les opérations d'attente. La seule chose qui peut arriver est qu'une opération de mise à jour doit être répétée car une mise à jour simultanée a interféré la mise à jour. La répétition, comme toute autre opération, consomme 100% du temps CPU. La seule façon de mesurer la contention ici est de mesurer le nombre de répétitions. À moins que les enregistrements d'implémentation de l'algorithme ne se répètent, vous devez mesurer le temps CPU de l'opération de mise à jour (qui augmentera lors de la contention) et le comparer au temps d'exécution global du thread. – Holger

Répondre

3

Il n'y a aucun moyen de mesurer l'affirmation sur « mémoire » sans coûts prohibitifs de performance. Une mesure directe (par exemple un contre-enroulement correctement synchronisé de tous les accès) introduira les goulots d'étranglement artificiels, ce qui fera exploser la fiabilité du test.

« même temps » est vaguement défini sur l'échelle que vous voulez mesurer, car un seul CPU « possède » l'emplacement particulier dans la mémoire dans un temps donné. Le mieux que vous puissiez faire dans ce cas est de mesurer la vitesse à laquelle les processeurs traitent des conflits de mémoire, par ex. à travers les compteurs HW. Cela nécessite la compréhension du sous-système de la mémoire sur un platfom donné. En outre, l'attribut compteurs HW pour l'état machine (= CPU), pas l'état de la mémoire; En d'autres termes, vous pouvez estimer le nombre de conflits que les instructions particulières ont subies, et non le nombre de processeurs accédant à l'emplacement mémoire donné.

+0

Fiabilité du test était un point à s'inquiéter. Pouvez-vous s'il vous plaît me donner des liens pour les compteurs HW? Merci! – grillSandwich

+0

OProfile a une belle docs: http://oprofile.sourceforge.net/docs/. –

1

Essayer la mesure dans la source de la contention est la mauvaise approche. Quelle pourrait être la raison de la controverse de toute façon ?!

Ainsi, tout d'abord, la configuration d'une suite d'étalonnage qui gère les schémas d'accès typiques sur votre structure de données et le graphique de la performance pour les différents comptes de fil. Voici un bel exemple de nitro cache performance page.

Si vous redimensionnez presque linéaire: bravo, vous avez terminé!

Si vous ne faites pas d'échelle linéaire, vous avez besoin de plus d'informations. Vous devez maintenant définir le système dans son ensemble et voir quelle est la raison, par ex. pour les boîtiers de pipeline d'UC. Le meilleur moyen est d'utiliser un suivi de faible surcharge pour cela. Sous Linux, vous pouvez utiliser OProfile. OProfile a également un support Java, qui vous aide à corréler le code machine JITed à votre programme Java.

+0

En supposant que nous parlons d'une liste, les threads soutiennent la modification d'un champ d'un nœud avant que les autres le fassent. Tous les threads, sauf le premier, effectuent une course pour modifier le nœud nouvellement ajouté. C'est la prétention. Merci pour les liens! – grillSandwich

+0

Ah, désolé, je vous ai un peu tort. – cruftex

+0

Si vous voulez trouver des zones de contention de verrouillage, je suggère de commencer au niveau haut avec un profileur d'échantillonnage, par exemple. HPROF. Comme c'est l'échantillonnage, vous pouvez ajuster les frais généraux imposés. – cruftex