perf estava silenciosamente deixando de contar as opções de contexto porque você não era root.
(o Linux tem 64k buffers de pipe. Em ambos os casos, você pode ver muito perto de 2 switches de contexto por 64k transferidos. Não sei exatamente como isso funciona, mas eu suspeito que seja apenas contando comutadores de contexto away de dd
, para o outro dd
, ou para a tarefa ociosa para essa cpu).
$ sudo perf stat taskset 0x1 sh -c 'dd bs=1M </dev/zero|dd bs=1M >/dev/null'
^C14508+0 records in
14507+0 records out
15211692032 bytes (15 GB, 14 GiB) copied, 3.87098 s, 3.9 GB/s
14508+0 records in
14508+0 records out
15212740608 bytes (15 GB, 14 GiB) copied, 3.87044 s, 3.9 GB/s
taskset: Interrupt
Performance counter stats for 'taskset 0x1 sh -c dd bs=1M </dev/zero|dd bs=1M >/dev/null':
3872.597645 task-clock (msec) # 1.000 CPUs utilized
464,325 context-switches # 0.120 M/sec
0 cpu-migrations # 0.000 K/sec
928 page-faults # 0.240 K/sec
11,099,016,844 cycles # 2.866 GHz
13,765,220,898 instructions # 1.24 insn per cycle
3,053,464,009 branches # 788.480 M/sec
15,462,959 branch-misses # 0.51% of all branches
3.874121023 seconds time elapsed
$ echo $((15212740608 / 464325))
32763
$ sudo perf stat sh -c 'dd bs=1M </dev/zero|dd bs=1M >/dev/null'
^C7031+0 records in
7031+0 records out
7032+0 records in
7031+0 records out
7372537856 bytes (7.4 GB, 6.9 GiB) copied, 4.27436 s, 1.7 GB/s7372537856 bytes (7.4 GB, 6.9 GiB) copied, 4.27414 s, 1.7 GB/s
sh: Interrupt
Performance counter stats for 'sh -c dd bs=1M </dev/zero|dd bs=1M >/dev/null':
3736.056509 task-clock (msec) # 0.873 CPUs utilized
218,047 context-switches # 0.058 M/sec
206 cpu-migrations # 0.055 K/sec
877 page-faults # 0.235 K/sec
8,328,413,541 cycles # 2.229 GHz
7,617,859,285 instructions # 0.91 insn per cycle
1,671,904,009 branches # 447.505 M/sec
13,827,669 branch-misses # 0.83% of all branches
4.277591869 seconds time elapsed
$ echo $((7372537856 / 218047))
33811