Considerare un punto di riferimento di un'applicazione C ++. Fa poco o nessun I / O in proporzione al suo runtime complessivo - è ad alta intensità di calcolo. È un programma a thread singolo. Esso legge / legge in tutti i suoi dati all'inizio, quindi esegue molte iterazioni del core task in mano, in modo da calcolare la media della cache o altre variazioni effimere.
Lo eseguiamo su un grande sistema Linux multi-core con molta più memoria di quanta ne usi, che ha una gerarchia di memoria NUMA. Lo eseguiamo sulla macchina quando è "inattivo". Ovviamente, ha un certo numero di soliti demoni che fluttuano intorno, ma dovrebbero esserci molti core e memoria da conservare per renderli felici.
Osserviamo una sorprendente (per noi) gamma di variazione nel tempo dell'orologio a muro che risulta.
Qualcuno può suggerire dove cercare una spiegazione, o cosa fare per ridurre la variazione?
uname:
Linux perf2.basistech.net 2.6.32-71.29.1.el6.x86_64 #1 SMP Mon Jun 27 19:49:27 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
numactl --show:
~/ numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
cpubind: 0 1
nodebind: 0 1
membind: 0 1
~/ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14
node 0 size: 6144 MB
node 0 free: 2030 MB
node 1 cpus: 1 3 5 7 9 11 13 15
node 1 size: 6134 MB
node 1 free: 144 MB
node distances:
node 0 1
0: 10 20
1: 20 10