Как отслеживать количество системных вызовов, выполняемых ядром? - PullRequest
4 голосов
/ 06 января 2012

Мне нужно отслеживать количество системных вызовов, выполняемых Linux. Мне известно, что vmstat может показывать это для систем BSD и AIX, но для Linux это невозможно (согласно man-странице).

Есть ли счетчик в /proc? Или есть какой-то другой способ его контролировать?

Ответы [ 5 ]

5 голосов
/ 09 января 2012

Я написал простой скрипт SystemTap (на основе syscalls_by_pid.stp ). Это производит вывод как это:

ProcessName          #SysCalls

munin-graph          38609 
munin-cron           8160  
fping                4502  
check_http_demo      2584  
check_nrpe           2045  
sh                   1836  
nagios               886   
sendmail             747   
smokeping            649   
check_http           571   
check_nt             376   
pcscd                216   
ping                 108   
check_ping           100   
crond                87    
stapio               69    
init                 56    
syslog-ng            27    
sshd                 17    
ntpd                 9     
hp-asrd              8     
hald-addon-stor      7     
automount            6     
httpd                4     
stap                 3     
flow-capture         2     
gam_server           2     

Total                61686

Сам скрипт:

#! /usr/bin/env stap

#
# Print the system call count by process name in descending order.
#

global syscalls

probe begin {
  print ("Collecting data... Type Ctrl-C to exit and display results\n")
}

probe syscall.* {
  syscalls[execname()]++
}

probe end {
  printf ("%-20s %-s\n\n", "ProcessName", "#SysCalls")
  summary = 0
  foreach (procname in syscalls-) {
    printf("%-20s %-10d\n", procname, syscalls[procname])
    summary = summary + syscalls[procname]
  }
  printf ("\n%-20s %-d\n", "Total", summary)
}
2 голосов
/ 06 января 2012

Вы можете использовать pstrace , как сказал Джефф Фостер, для отслеживания системного вызова.

Также вы можете использовать strace и ltrace

strace - трассировка системных вызовов и сигналов

ltrace - библиотека трассировки вызовов

1 голос
/ 06 января 2012

Я считаю, OProfile может сделать это.

1 голос
/ 06 января 2012

Вы можете использовать ptrace для мониторинга всех системных вызовов (см. здесь )

0 голосов
/ 06 января 2012

Я не знаю о централизованном способе мониторинга системных вызовов во всей ОС. Может быть, сделать ptrace на init процессе и следовать за всеми детьми? Но я не знаю, сработает ли это.

Лучше всего написать патч для самого ядра, чтобы сделать это. Самым близким к этому, что я видел, является реализация cgroup для обеспечения прав доступа к тому, какие системные вызовы могут выполняться во время выполнения. Вы можете найти патч здесь:

https://github.com/luksow/syscalls-cgroup

С точки зрения программирования ядра не должно быть слишком много работы, чтобы добавить туда счетчик.

...