Есть ли такая команда, как time
который может записывать сетевую статистику ввода-вывода процесса и распечатывать ее при выходе?
Linux (и другие * nix) имеют time
команда, которая позволяет записывать время выполнения - не только время настенных часов, но и время процессора ядра и системы, распределение памяти, активность дискового ввода-вывода и многое другое. Это полезно, потому что его можно запускать как простую оболочку команд, а также отслеживать дочерние элементы.
например
$ TIME="t=%E; I/O=%I:%O" time find $HOME > /dev/null
t=0:08.78; I/O=821408:0
но счетчики сети %r
и %s
подсчитывать только вызовы send () / recv (); нет TCP и нет объема данных. Так что они бесполезны для сетевой активности.
Я подтвердил с
TIME="t=%E; I/O=%I:%O" time wget $somewebsite -O /dev/null
чтение / запись этого сокета не учитывается для ввода-вывода, как и фиктивные устройства. То же самое для stdio. Это только кажется, что отслеживает чтение и запись файловой системы.
Но где я могу получить статистику сети?
Я знаю, что могу использовать множество инструментов, например:
wireshark
/ tshark
/ tcpdump
ss
/ netstat
lsof
nethogs
/ iptraf
/ iftop
/ tcptrack
strace
(медленный, мелкозернистый)но ни один из них не упрощает нацеливание только на один процесс или дерево процессов и запись его общей сетевой активности за время его существования.
Я знаю, что можно установить socat
вверх как прокси. Но это тоже очень неудобно; он не может работать просто как оболочка.
perf
может это сделать, но он очень зависит от платформы и может быть хрупким.
Конечно, есть что-то простое и банальное, что либо:
LD_PRELOAD
и собирает по ним статистику; или?