Назад | Перейти на главную страницу

Медленное выполнение команд в Linux

На суперпользователе ребята предложили зайти сюда.

Мы наблюдаем некоторое медленное выполнение простых команд в 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 и что мы уже пробовали:

Любые идеи и предложения приветствуются.

Мы нашли первопричину.

Мы бежали

/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.