[BENCHMARK] nproc: Look Ma, No get_tgid_list!

Roger Luethi
2004-08-31T15:36:05Z

This posting demonstrates a new method of monitoring all processes in
a large system.

You may remember what a /proc based tool does when monitoring some
10^5 processes -- it spends its time in the kernel hanging on to a
read task_list_lock:

==> 10000 processes: top -d 0 -b > /dev/null <==
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples % image name symbol name
35855 36.0707 vmlinux get_tgid_list
9366 9.4223 vmlinux pid_alive
7077 7.1196 libc-2.3.3.so _IO_vfscanf_internal
5386 5.4184 vmlinux number
3664 3.6860 vmlinux proc_pid_stat
3077 3.0955 libc-2.3.3.so _IO_vfprintf_internal
2136 2.1489 vmlinux __d_lookup
1720 1.7303 vmlinux vsnprintf
1451 1.4597 libc-2.3.3.so __i686.get_pc_thunk.bx
1409 1.4175 libc-2.3.3.so _IO_default_xsputn_internal
1258 1.2656 libc-2.3.3.so _IO_putc_internal
1225 1.2324 vmlinux link_path_walk
1210 1.2173 libc-2.3.3.so ____strtoul_l_internal
1199 1.2062 vmlinux task_statm
1157 1.1640 libc-2.3.3.so ____strtol_l_internal
794 0.7988 libc-2.3.3.so _IO_sputbackc_internal
776 0.7807 libncurses.so.5.4 _nc_outch

Here's a profile for an nproc based tool monitoring the same set
of processes:

==> 10000 processes: nprocbench <==
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples % app name symbol name
8641 24.8626 vmlinux __task_mem
2778 7.9931 vmlinux find_pid
2536 7.2968 vmlinux finish_task_switch
1872 5.3863 vmlinux netlink_recvmsg
1637 4.7101 vmlinux nproc_pid_fields
1373 3.9505 vmlinux __wake_up
1218 3.5045 vmlinux __copy_to_user_ll
1134 3.2628 vmlinux __task_mem_cheap
944 2.7162 vmlinux mmgrab
876 2.5205 vmlinux nproc_ps_do_pid
568 1.6343 vmlinux skb_dequeue
526 1.5135 libc-2.3.3.so __recv
514 1.4789 vmlinux alloc_skb
510 1.4674 vmlinux __might_sleep
485 1.3955 vmlinux skb_release_data
463 1.3322 vmlinux netlink_attachskb
363 1.0445 vmlinux sys_recvfrom

Resource usage is now dominated by field computation, rather than by
delivery overhead. By now it should be clear that nproc is not only a
cleaner interface with lower overhead for tools, it also scales a lot
better than /proc.

Roger