На суперпользователе ребята предложили зайти сюда.
Мы наблюдаем некоторое медленное выполнение простых команд в Linux, возможно, связанное с медлительностью procfs.
Как просто uptime
выполнение команды может занять несколько секунд.
Вот входы:
Мы запускаем докер примерно с 250 контейнерами.
Использование:
Некоторая статистика ОС:
# cat /proc/loadavg
100.45 108.30 109.41 35/254951 544357
# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
110 2 791584 485552640 50354496 687472448 0 0 426 183 1 1 10 8 82 1 0
13 0 791584 485495104 50353940 687477568 0 0 22820 47984 196555 326943 12 12 75 1 0
33 1 791584 485385632 50352428 687473536 0 0 38932 52892 166486 389428 13 14 72 1 0
# ps axu| wc -l
3792
Что именно происходит?
Запуск простых команд требует времени, если команды каким-либо образом используют procfs. Нравится делать ls
в каталоге с парой файлов застревает при открытом системном вызове procfs
# strace -r ls
...
0.000084 open("/proc/filesystems", O_RDONLY) = 3
3.652504 fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
...
Или uptime
:
# strace -r uptime
...
0.000035 open("/proc/filesystems", O_RDONLY) = 3
11.014154 fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
...
0.000044 open("/proc/uptime", O_RDONLY) = 3
1.554646 lseek(3, 0, SEEK_SET)
...
Быстрый Q / A и что мы уже пробовали:
--ipc=host
и --pid=host
флаги.Любые идеи и предложения приветствуются.
Мы нашли первопричину.
Мы бежали
/usr/share/bcc/tools/funcslower -m 250 -T proc_pid_readdir
чтобы получить процессы, которые вызывали долгие вызовы proc_pid_readdir
Когда мы это сделали, у нас было несколько процессов:
zabbix_agent
atop
byobu
Все они звонили очень долго.
TIME COMM PID LAT(ms) RVAL FUNC
20:01:35 zabbix_agentd 921144 1258.01 0 proc_pid_readdir
20:01:38 zabbix_agentd 921144 2692.71 0 proc_pid_readdir
20:01:39 zabbix_agentd 921145 1276.88 0 proc_pid_readdir
Когда мы остановили ВСЕ это - мы увидели большие улучшения.
Так выглядит смешивание множества процессов и потоков + вызов proc_pid_readdir
слишком часто вызывает большую медлительность процесса.
Сегодня мы попробуем ядро 4.14 и посмотрим, станет ли оно лучше.
ОБНОВИТЬ:
Ядро 4.14 также решило нашу проблему. Простой мьютекс для каждого inode заменен на rwsem
.