Найти, в какие файлы пишет процесс apache?
У нас есть этот процесс Apache, который время от времени становится связанным. Используя поверх, мы можем видеть, что это операция записи.
С помощью lsof -p <PID>
мы можем увидеть список файлов, открытых процессом httpd. Сначала мы подумали, что файлы журнала должны быть проблемой. Поэтому мы отключили их только для проверки. Однако операции записи все еще продолжаются.
Мы продолжим тестировать еще несколько вещей. Например, мы часто используем переменные сессии php. Возможно файлы сессии php получают всю запись.
Но есть ли способ быстро идентифицировать файлы, в которые записывается процесс httpd? Таким образом, мы можем сосредоточить свои усилия на этих файлах.
ОБНОВИТЬ:
Мы использовали команду strace как предложено. Вот две строки из вывода.
write(23, "\27\0\0\0\3SET CHARACTER SET utf8", 27) = 27
write(23, "\17\0\0\0\3SET NAMES utf8", 19) = 19
У нас нет процесса mysql на этом сервере. Так что, strace также показывает, что записывается в порт Ethernet?
ОБНОВЛЕНИЕ2: Во время высокой нагрузки ввода-вывода процесс, который потребляет большую часть ресурсов записи, дает следующий вывод strace -e trace=write -p <PID>
:
--- SIGCHLD (ребенок вышел) @ 0 (0) ---
написать (9, "!", 1) = 1
write (19, "OPTIONS * HTTP / 1.0 \ r \ nUser-Agent: Apache (внутреннее фиктивное соединение)\r\n\r\n", 70) = 70
Однако я не могу понять, где они пишутся.
ОБНОВЛЕНИЕ 3: Попробовал следующую команду, которая покажет мне все файлы, открытые для записи:
lsof | grep -e "[[:digit:]]\+w"
и ниже только две строки, которые я не могу проверить. Другие файлы не показывают каких-либо значительных операций записи. Могут ли пункты ниже временно записываться на жесткий диск?
httpd 14173 apache 9w FIFO 0,6 205676000 pipe
httpd 14173 apache 1w CHR 1,3 3346 /dev/null
ПРИЧИНА НАЙДЕНА:
Наконец, мы узнали, что причиной io-привязанности были файлы сессий php. Перемещение файлов сеанса php на другой жесткий диск также немедленно переместило io-привязанность к этому жесткому диску. Возможно, мы переместим сеансы в redis или другую систему, основанную на памяти. Интересно, что хотя ответы, приведенные ниже, являются технически правильными, они не привели нас к файлам сеанса и заставили нас взглянуть на различные точки системы.
3 ответа
Я думаю, что lsof - лучший инструмент для просмотра файлов, которые он открыл в данный момент.
lsof -p <pid>
Вы уверены, что посмотрите на правильный процесс? Каждый "сервер" Apache - это отдельный процесс, поэтому вы должны зациклить элемент управления для каждого дочернего элемента (вы начинаете с числа, определенного в StartServers
Директива).
Чтобы увидеть соединения:
netstat -nap | grep <pid>