====== 2022-11-09 Unraid - проблема с переодическим lsof который вешает систему ======
На одном из домашних серверов установлен UNRAID. Недавно заметил такую особенность, когда снял с этого nas всю полезную нагрузку. Переодически раз в несколько минут запускается команда lsof которая повергает весь сервер в ступор.
Вызывается она с такими переменными:
sh -c LANG='en_US.UTF8' lsof -Owl /mnt/disk[0-9]* 2>/dev/null|awk '/^shfs/ && $0!~/\.AppleD(B|ouble)/ && $5=="REG"'|awk -F/ '{print $4}'
По-видимому это часть сбора статистики для веб интерфейса, которая написана привычным для unraid способом - "кое как лишь бы работало". Вызывается эта строка из файла: /usr/local/emhttp/webGui/nchan/update_1
Вот полный листинг этого файла:
#!/usr/bin/php -q
$docroot = '/usr/local/emhttp';
$varroot = '/var/local/emhttp';
require_once "$docroot/webGui/include/publish.php";
while (true) {
unset($memory,$sys,$rpms,$lsof);
exec("grep -Po '^Mem(Total|Available):\s+\K\d+' /proc/meminfo",$memory);
exec("df /boot /var/log /var/lib/docker|grep -Po '\d+%'",$sys);
exec("sensors -uA 2>/dev/null|grep -Po 'fan\d_input: \K\d+'",$rpms);
$info = max(round((1-$memory[1]/$memory[0])*100),0)."%\0".implode("\0",$sys);
$rpms = count($rpms) ? implode(" RPM\0",$rpms).' RPM' : '';
$names = array_keys((array)parse_ini_file("$varroot/shares.ini"));
exec("LANG='en_US.UTF8' lsof -Owl /mnt/disk[0-9]* 2>/dev/null|awk '/^shfs/ && \$0!~/\.AppleD(B|ouble)/ && \$5==\"REG\"'|awk -F/ '{print \$4}'",$lsof);
$counts = array_count_values($lsof); $count = [];
foreach ($names as $name) $count[] = $counts[$name] ?? 0;
$count = implode("\0",$count);
publish('update1', "$info\1$rpms\1$count");
sleep(5);
}
?>
Cкорее всего этот скрипт считает количество открытых сессий к общим папкам для вывода этой информации на консоль в этом месте интерфейса:
{{:blog:2022:11:09:20221109-160854.png}}
Бесполезная трата ресурса. Я поискал записи на форуме unraid на предмет данной проблемы. Судя по всему она появилась достаточно давно и беспокоит только некоторых пользователей с нагруженными машинами, где lsof выполняется очень долго.
Для начала я попробовал исключить строку, вызывающую lsof из файла update_1. Это не принесло никакого результата, потому что видимо файл загружен в память и система работает с ним оттуда. После перезагрузки системные файлы заменяются файлами из образа, так как ОС работает с "золотым" образом который при старте системы загружается в память с USB диска.
В конце концов я заметил что процесс php работающий с данным файлов все еще запущен и убил его командой:
pkill -f "/usr/bin/php -q /usr/local/emhttp/webGui/nchan/update_1"
Затем я провел еще несколько наблюдений:
* После перезагрузки системы скрипты update_1, update_2, update_3 не запускаются, пока пользователь не войдет в веб интерфейс и не откроет страницу "Dashboard".
* Скрипты продолжают отрабатывать в любом случае вне зависимости как пользователь покидает страницу.
* Если убить скрипты командой ''killall /usr/bin/php'' - они не возвращаются никогда. Значит в системе есть какая-то проверка на успешность запуска этих скриптов, например PID файл.
Написал по этому поводу [[https://forums.unraid.net/topic/114162-100-cpu-usage-lsof/?do=findComment&comment=1189566|реплай в самой продвинутой ветке форума unraid.]]