исправление: утечки ФД и временных файлов, переполнение ОЗУ
Проблема с FD-каскадом (зависание sing-box):
watchdog.uc открывал logread -f через popen() без O_CLOEXEC. Каждый
фоновый system('... &') порождал дочерний процесс, наследующий read-end
logread pipe. После kill watchdog — дочерний процесс держал pipe, logread
не получал SIGPIPE и оставался живым. За N перезапусков накапливалось
N orphan-процессов logread → исчерпание лимита 1024 FD → генератор
конфига sing-box не мог открыть .uc файлы → sing-box не стартовал.
Исправления FD-утечки:
- watchdog.uc: добавлена переменная logread_pipe_fd + помощник bg_system(),
который закрывает FD logread перед запуском фоновых процессов
- watchdog.uc: killall logread перед открытием нового logread -f в
setup_syslog_listener() для очистки orphan-процессов от предыдущих экземпляров
- watchdog.uc: все 7 вызовов system('... &') переведены на bg_system():
restart, reload_firewall (x3), WAN ifdown/ifup, subscription_update_async (x3)
- initd.uc: killall logread в stop_service() после остановки tachyon
- nft/apply.uc: добавлены </dev/null >/dev/null 2>&1 к голому reload_firewall &
- updates.uc: добавлены редиректы к tachyon reload &
- telegram.uc: добавлен </dev/null к reload_firewall &
Проблема с утечкой временных файлов (500MB в /tmp):
При каждом tachyon restart (SIGKILL) процессы-генераторы умирали на
полуслове, оставляя /tmp/tmp.* файлы (sing-box config JSON ~3.4MB,
reload state). За 8 дней накопилось 227 файлов = 506MB в tmpfs,
что занимало 25% всего ОЗУ (519MB из 2007MB shared).
Исправления утечки временных файлов:
- temp_path() в runtime.uc и updates.uc теперь создаёт /tmp/tachyon-XXXXXX
вместо /tmp/tmp.XXXXXX (безопасный для очистки префикс)
- nft/apply.uc и lifecycle.uc: аналогичное изменение mktemp
- lifecycle.uc start_impl(): автоматическая очистка /tmp/tachyon-* файлов
старше 30 минут при каждом старте сервиса
Результат на роутере 192.168.2.1:
logread после stop = 0 (было 1+)
logread после start = 1 (было 2+ в каскаде)
sing-box = запущен
/tmp shared = 27MB (было 519MB, освобождено ~490MB)
ОЗУ available = 1691MB (было 1195MB)
This commit is contained in:
@@ -332,7 +332,7 @@ function ensure_parent_dir(path) {
|
||||
}
|
||||
|
||||
function temp_path() {
|
||||
return trim(command_output_from_args([ "mktemp" ]));
|
||||
return trim(command_output_from_args([ "mktemp", "/tmp/tachyon-XXXXXX" ]));
|
||||
}
|
||||
|
||||
function remove_files(paths) {
|
||||
@@ -2309,7 +2309,7 @@ function import_builtin_subnets_from_rule(section, settings) {
|
||||
write_file(cached_file, join("\n", combined_lines) + "\n");
|
||||
ensure_dir("/etc/tachyon/rulesets");
|
||||
write_file(persistent_file, join("\n", combined_lines) + "\n");
|
||||
system("/etc/init.d/tachyon reload &");
|
||||
system("/etc/init.d/tachyon reload </dev/null >/dev/null 2>&1 &");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user