На сервере предварительной подготовки Apache, на котором запущено приложение PHP в Linux, каждый HTTP-запрос может получать некоторые данные с другого сервера, например Memcached. Допустим, мы хотим узнать 10 самых популярных HTTP-запросов (например, GET /blabla
), которые потребляют максимальную пропускную способность для Memcached. Есть ли способ отслеживать, сколько исходящей полосы пропускания было занято на HTTP-запрос, без изменения приложения PHP?
Мой подход использовал tcpdump
и netstat
или /proc/net/tcp
. С помощью приведенной ниже команды он будет собирать входящий и исходящий HTTP-трафик. Но я не могу легко сказать, какой именно HTTP-запрос делает какие соединения с Memcached. Хотя это предварительная вилка Apache, PID для каждого HTTP-запроса может регистрироваться, хотя tcpdump
не знает, какой процесс сделал эти пакеты.
tcpdump -i any src port 80 or port 11211 -w tcpdump.log
С участием netstat
, часто я обнаруживаю, что в его выводе отсутствует информация о PID.
netstat -tpc >netstat.log
Чтобы сопоставить PID с подключенными сокетами, я могу сканировать /proc
и получить идентификатор процесса и локальные порты. Итак, у меня есть пара PID и список локальных портов, подключенных к Memcached. Выполняя поиск этих номеров портов в tcpdump.log, я получаю длину пакетов.
Я не уверен, что сканирование всего каталога каждую секунду или даже чаще будет эффективным, в то время как Apache порождает более 100 процессов в моем случае. Думал, может быть способ получше.