Сильно ли ошибка страницы влияет на производительность, разветвляя дочерний процесс?

#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. Попробуйте на самом деле профилировать свой процесс с помощью трассировок стека (ядра) во время развилки. Что-то в вашей системе ведет себя нерегулярно.