#linux #fork #copy-on-write #page-fault
Вопрос:
У меня есть загруженный процесс, который занимает 30% процессора и 1 г памяти в Linux. Процесс делает снимок каждый час, вызывая fork()
дочерний процесс, который записывает все данные в файл. Это занимает около 1 секунды.
Я обнаружил, что загрузка процессора отцовского процесса во время моментального снимка составляет около 60%.
Я предполагаю, что причина может быть в следующем: разветвление дочернего процесса создает большую часть памяти как копирование при записи, а дочерний процесс просто считывает память, поэтому он не вызывает сбоя страницы для копирования страниц, в то время как процесс отца вызывает много сбоев страниц, что приводит к более высокой загрузке процессора.
Я прав? Может ли ошибка страницы так сильно повлиять на производительность?
Спасибо Ву
== добавить статистику ==
Я подсчитываю количество ошибок на странице ps -o min_flt
, и в секунду происходит ~7 тысяч ошибок на странице. Сильно ли это влияет на производительность?
Комментарии:
1. Ответьте » Нет » (не так просто, как вы описываете). Предложите прочитать » Понимание ошибок страниц и подкачки/подкачки памяти»: когда вам следует беспокоиться?
2. На самом деле да. Рендеринг существующих страниц для копирования при записи, а также разветвление таблицы страниц должны быть максимально дешевыми, а ошибки на страницах впоследствии устраняются со скоростью 5-15 ГБ/с. Теоретически. Существует наихудший сценарий, с которым вы, скорее всего, столкнетесь здесь: конфликт в таблице страниц родительского процесса. Запуск сбоя страницы, когда таблица страниц заблокирована для других обновлений, отправит вас прямо в блокировку в прерывании сбоя страницы. Становится хуже, когда больше потоков борются за запись в память и за ошибки страниц, вплоть до полного истощения одного рабочего потока пропускной способности памяти.
3. @Ext3h Процессы отца и ребенка имеют только 1 поток. И ребенок просто сбрасывает данные, поэтому не пишите общую страницу. Поэтому я думаю, что разногласий быть не должно.
4. Если во время форка не выполняется ни один поток, то для форка всего 1 ГБ памяти не должно потребоваться и секунды. И вы также не должны получать сбои страниц во время форка в любом значительном количестве. 7k подкачек с 4k страницами соответствуют только 28 МБ памяти, что более чем правдоподобно (даже клонирование таблицы страниц должно занять столько же) и вряд ли должно быть измеримо.
5. Попробуйте на самом деле профилировать свой процесс с помощью трассировок стека (ядра) во время развилки. Что-то в вашей системе ведет себя нерегулярно.