2016-04-29 18 views
2

Ich versuche, einige Leistungsprobleme mit Pthreads auf Linux zu debuggen, und ich denke, sched_getcpu() kann mich belügen. Sie meldet für jeden Thread eine konstante CPU, während Profiling-Experimente darauf hindeuten, dass die Threads während ihrer Lebensdauer tatsächlich von einem Kern zum anderen migrieren.Ist sched_getcpu() unter Linux zuverlässig?

Ich frage mich, ob sched_cpu() meldet nur die erste CPU, die der Thread gestartet wurde, und ist nicht auf Thread Migration? Hat jemand anderes dies bemerkt oder Beweise dafür gesehen, dass sich der Rückgabewert von sched_getcpu() ändern könnte? Wenn es nicht realiable ist, gibt es irgendwelche anderen Methoden, um gegenwärtige CPU zu verfolgen (Gebrauch CPUID vielleicht?)?

Antwort

2

http://man7.org/linux/man-pages/man2/getcpu.2.html zeigt an, dass sched_getcpu() nur ein Wrapper für getcpu() ist.

http://man7.org/linux/man-pages/man2/getcpu.2.html schlägt vor, dass die bereitgestellten Informationen richtig sind, da eine alte Caching-Option wird nicht mehr verwendet:

Das TCACHE Argument wird nicht verwendet, da Linux 2.6.24 ... spezifiziert einen Zeiger auf einen Anrufer -allokierter Puffer im lokalen Thread-Speicher, der verwendet wurde, um einen Cache-Mechanismus für getcpu() bereitzustellen. Die Verwendung des Caches könnte die getcpu() - Aufrufe beschleunigen, und zwar auf Kosten einer sehr kleinen Chance, dass die zurückgegebene Information veraltet sein würde. Der Caching-Mechanismus wurde als Ursache für Probleme beim Migrieren von Threads zwischen CPUs angesehen, und das Argument wird jetzt ignoriert.

Wenn Sie also keinen Kernel vor 2.6.24 verwenden, scheint es unwahrscheinlich, dass Sie alte/zwischengespeicherte Informationen sehen können.

+0

Danke für die umfassende Antwort - meine Kernel-Version scheint 3.10 zu sein, so dass es klingt, als sollte ich dieses Verhalten nicht sehen. Ich muss etwas tiefer graben ... –