У меня есть система, в которой выполняются два одинаковых процесса (пусть их называют репликами). Когда сигнализируется, реплика дублирует себя, используя вызов fork()
. Третий процесс выбирает один из процессов для случайного уничтожения, а затем сигнализирует другому, чтобы создать замену. Функционально система работает хорошо; он может убивать/респанировать реплики весь день, кроме проблемы с производительностью.
Вызов fork()
длится дольше. Ниже приведена простейшая настройка, которая все еще отображает проблему. Временная диаграмма будет отображена на графике ниже:
Код реплики выглядит следующим образом:
void restartHandler(int signo) {
// fork
timestamp_t last = generate_timestamp();
pid_t currentPID = fork();
if (currentPID >= 0) { // Successful fork
if (currentPID == 0) { // Child process
timestamp_t current = generate_timestamp();
printf("%lld\n", current - last);
// unblock the signal
sigset_t signal_set;
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGUSR1);
sigprocmask(SIG_UNBLOCK, &signal_set, NULL);
return;
} else { // Parent just returns
waitpid(-1, NULL, WNOHANG);
return;
}
} else {
printf("Fork error!\n");
return;
}
}
int main(int argc, const char **argv) {
if (signal(SIGUSR1, restartHandler) == SIG_ERR) {
perror("Failed to register the restart handler");
return -1;
}
while(1) {
sleep(1);
}
return 0;
}
Чем дольше система работает, тем хуже она становится.
Извините, что у вас нет конкретного вопроса, но есть ли у кого-нибудь идеи/подсказки относительно того, что происходит? Мне кажется, что в ядре протекает утечка ресурсов (таким образом, тег linux-kernel), но я не знаю, с чего начать искать.
Что я пробовал:
- Попробовал kmemleak, который ничего не поймал. Это означает, что если есть некоторая память "утечка", что она еще доступна.
-
/proc/<pid>/maps
не растет. - В настоящее время запущено ядро 3.14 с RT patch (обратите внимание, что это происходит с процессами non-rt и rt), а также попробовал 3.2.
- Процессы зомби не являются проблемой. Я попробовал версию, в которой я настраивал другой процесс как подстроку, используя prctl
- Я впервые заметил это замедление в системе, в которой измерения времени находятся за пределами перезапускаемого процесса; такое же поведение.
Любые подсказки? Все, что я могу предоставить, чтобы помочь? Спасибо!