mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-02 09:40:13 +00:00
0ce657c576
Profiling git's test suite, Linus noted [1] that a disproportionately large amount of time was spent reading /proc/meminfo. This is done by the glibc functions get_phys_pages and get_avphys_pages, but they only need the MemTotal and MemFree fields, respectively. That same information can be obtained with a single syscall, sysinfo, instead of six: open, fstat, mmap, read, close, munmap. While sysinfo also provides more than necessary, it does a lot less work than what the kernel needs to do to provide the entire /proc/meminfo. Both strace -T and in-app microbenchmarks shows that the sysinfo() approach is roughly an order of magnitude faster. sysinfo() is much older than what glibc currently requires, so I don't think there's any reason to keep the old parsing code. Moreover, this makes get_[av]phys_pages work even in the absence of /proc. Linus noted that something as simple as 'bash -c "echo"' would trigger the reading of /proc/meminfo, but gdb says that many more applications than just bash are affected: Starting program: /bin/bash "-c" "echo" Breakpoint 1, __get_phys_pages () at ../sysdeps/unix/sysv/linux/getsysstats.c:283 283 ../sysdeps/unix/sysv/linux/getsysstats.c: No such file or directory. (gdb) bt So it seems that any application that uses qsort on a moderately sized array will incur this cost (once), which is obviously proportionately more expensive for lots of short-lived processes (such as the git test suite). [1] http://thread.gmane.org/gmane.linux.kernel/2019285 Signed-off-by: Rasmus Villemoes <rv@rasmusvillemoes.dk> * sysdeps/unix/sysv/linux/getsysstats.c (__get_phys_pages): Use sysinfo system call instead of parsing /proc/meminfo. * sysdeps/unix/sysv/linux/getsysstats.c (__get_avphys_pages): Likewise.
126 lines
5.2 KiB
Plaintext
126 lines
5.2 KiB
Plaintext
# File name Caller Syscall name Args Strong name Weak names
|
|
|
|
adjtimex adjtime adjtimex i:p __adjtimex adjtimex ntp_adjtime
|
|
alarm - alarm i:i alarm
|
|
bdflush EXTRA bdflush i:ii bdflush
|
|
capget EXTRA capget i:pp capget
|
|
capset EXTRA capset i:pp capset
|
|
clock_adjtime EXTRA clock_adjtime i:ip clock_adjtime
|
|
creat - creat Ci:si creat
|
|
create_module EXTRA create_module 3 create_module
|
|
delete_module EXTRA delete_module 3 delete_module
|
|
epoll_create EXTRA epoll_create i:i epoll_create
|
|
epoll_create1 EXTRA epoll_create1 i:i epoll_create1
|
|
epoll_ctl EXTRA epoll_ctl i:iiip epoll_ctl
|
|
epoll_wait EXTRA epoll_wait Ci:ipii epoll_wait
|
|
execve - execve i:spp __execve execve
|
|
fdatasync - fdatasync Ci:i fdatasync
|
|
flock - flock i:ii __flock flock
|
|
get_kernel_syms EXTRA get_kernel_syms i:p get_kernel_syms
|
|
getegid - getegid Ei: __getegid getegid
|
|
geteuid - geteuid Ei: __geteuid geteuid
|
|
getpgid - getpgid i:i __getpgid getpgid
|
|
getpgrp - getpgrp Ei: getpgrp
|
|
getpmsg - getpmsg i:ipppp getpmsg
|
|
getppid - getppid Ei: __getppid getppid
|
|
getresuid - getresuid i:ppp getresuid
|
|
getresgid - getresgid i:ppp getresgid
|
|
getrlimit - ugetrlimit i:ip __new_getrlimit __getrlimit getrlimit@@GLIBC_2.2
|
|
getsid - getsid i:i getsid
|
|
init_module EXTRA init_module 5 init_module
|
|
inotify_add_watch EXTRA inotify_add_watch i:isi inotify_add_watch
|
|
inotify_init EXTRA inotify_init i: inotify_init
|
|
inotify_init1 EXTRA inotify_init1 i:I inotify_init1
|
|
inotify_rm_watch EXTRA inotify_rm_watch i:ii inotify_rm_watch
|
|
ioperm - ioperm i:iii ioperm
|
|
iopl - iopl i:i iopl
|
|
klogctl EXTRA syslog i:isi klogctl
|
|
lchown - lchown i:sii __lchown lchown
|
|
mincore - mincore i:anV mincore
|
|
mlock - mlock i:bn mlock
|
|
mlockall - mlockall i:i mlockall
|
|
mount EXTRA mount i:sssip __mount mount
|
|
mremap EXTRA mremap b:ainip __mremap mremap
|
|
munlock - munlock i:ai munlock
|
|
munlockall - munlockall i: munlockall
|
|
nanosleep - nanosleep Ci:pp __nanosleep nanosleep
|
|
nfsservctl EXTRA nfsservctl i:ipp nfsservctl
|
|
pause - pause Ci: __libc_pause pause
|
|
personality EXTRA personality i:i __personality personality
|
|
pipe - pipe i:f __pipe pipe
|
|
pipe2 - pipe2 i:fi __pipe2 pipe2
|
|
pivot_root EXTRA pivot_root i:ss pivot_root
|
|
poll - poll Ci:pii __libc_poll __poll poll
|
|
prctl EXTRA prctl i:iiiii __prctl prctl
|
|
putpmsg - putpmsg i:ippii putpmsg
|
|
query_module EXTRA query_module i:sipip query_module
|
|
quotactl EXTRA quotactl i:isip quotactl
|
|
remap_file_pages - remap_file_pages i:piiii __remap_file_pages remap_file_pages
|
|
sched_getp - sched_getparam i:ip __sched_getparam sched_getparam
|
|
sched_gets - sched_getscheduler i:i __sched_getscheduler sched_getscheduler
|
|
sched_primax - sched_get_priority_max i:i __sched_get_priority_max sched_get_priority_max
|
|
sched_primin - sched_get_priority_min i:i __sched_get_priority_min sched_get_priority_min
|
|
sched_rr_gi - sched_rr_get_interval i:ip __sched_rr_get_interval sched_rr_get_interval
|
|
sched_setp - sched_setparam i:ip __sched_setparam sched_setparam
|
|
sched_sets - sched_setscheduler i:iip __sched_setscheduler sched_setscheduler
|
|
sched_yield - sched_yield i: __sched_yield sched_yield
|
|
select - _newselect Ci:iPPPP __select __libc_select select
|
|
sendfile - sendfile i:iipi sendfile
|
|
sendfile64 - sendfile64 i:iipi sendfile64
|
|
setfsgid EXTRA setfsgid i:i setfsgid
|
|
setfsuid EXTRA setfsuid i:i setfsuid
|
|
setpgid - setpgid i:ii __setpgid setpgid
|
|
sigaltstack - sigaltstack i:PP __sigaltstack sigaltstack
|
|
splice EXTRA splice Ci:iPiPii splice
|
|
stime - stime i:p stime
|
|
sysinfo EXTRA sysinfo i:p __sysinfo sysinfo
|
|
swapon - swapon i:si __swapon swapon
|
|
swapoff - swapoff i:s __swapoff swapoff
|
|
tee EXTRA tee Ci:iiii tee
|
|
unshare EXTRA unshare i:i unshare
|
|
uselib EXTRA uselib i:s uselib
|
|
utime - utime i:sP utime
|
|
vmsplice EXTRA vmsplice Ci:iPii vmsplice
|
|
wait4 - wait4 i:iWiP __wait4 wait4
|
|
|
|
chown - chown i:sii __libc_chown __chown chown
|
|
|
|
fchownat - fchownat i:isiii fchownat
|
|
linkat - linkat i:isisi linkat
|
|
mkdirat - mkdirat i:isi mkdirat
|
|
readlinkat - readlinkat i:issi readlinkat
|
|
renameat - renameat i:isis renameat
|
|
symlinkat - symlinkat i:sis symlinkat
|
|
unlinkat - unlinkat i:isi unlinkat
|
|
|
|
setxattr - setxattr i:sspii setxattr
|
|
lsetxattr - lsetxattr i:sspii lsetxattr
|
|
fsetxattr - fsetxattr i:ispii fsetxattr
|
|
getxattr - getxattr i:sspi getxattr
|
|
lgetxattr - lgetxattr i:sspi lgetxattr
|
|
fgetxattr - fgetxattr i:ispi fgetxattr
|
|
listxattr - listxattr i:ssi listxattr
|
|
llistxattr - llistxattr i:ssi llistxattr
|
|
flistxattr - flistxattr i:isi flistxattr
|
|
removexattr - removexattr i:ss removexattr
|
|
lremovexattr - lremovexattr i:ss lremovexattr
|
|
fremovexattr - fremovexattr i:is fremovexattr
|
|
|
|
mq_timedsend - mq_timedsend Ci:ipiip __mq_timedsend mq_timedsend
|
|
mq_timedreceive - mq_timedreceive Ci:ipipp __mq_timedreceive mq_timedreceive
|
|
mq_setattr - mq_getsetattr i:ipp mq_setattr
|
|
|
|
timerfd_create EXTRA timerfd_create i:ii timerfd_create
|
|
timerfd_settime EXTRA timerfd_settime i:iipp timerfd_settime
|
|
timerfd_gettime EXTRA timerfd_gettime i:ip timerfd_gettime
|
|
|
|
fanotify_init EXTRA fanotify_init i:ii fanotify_init
|
|
|
|
name_to_handle_at EXTRA name_to_handle_at i:isppi name_to_handle_at
|
|
open_by_handle_at EXTRA open_by_handle_at Ci:ipi open_by_handle_at
|
|
|
|
setns EXTRA setns i:ii setns
|
|
|
|
process_vm_readv EXTRA process_vm_readv i:ipipii process_vm_readv
|
|
process_vm_writev EXTRA process_vm_writev i:ipipii process_vm_writev
|