В macOS нашли баг отключения сетевого подключения спустя 49 дней и 17 часов непрерывной работы
Если использовать Mac в качестве серверного устройства и оставить его включённым на 49 дней, 17 часов, 2 минуты и 47 секунд, то многие компоненты внезапно перестанут работать, поскольку выйдет из строя сетевой стек TCP/IP.
Таковы выводы специалистов из Photon, которые провели серьёзное расследование после обнаружения загадочной проблемы в парке компьютеров Mac, используемых для мониторинга сервисов iMessage. Проблема выявилась, когда некоторые машины внезапно перестали отвечать на сетевые подключения, хотя на запросы ping они реагировали.
Устройства продолжали поддерживать существующие сетевые соединения, что ещё больше затрудняло диагностику, поскольку сбой был необъяснимым и невидимым. Не имея другого выбора, специалистам Photon пришлось перезагрузить машины, чтобы устранить проблему.
После того, как команда обнаружила ещё одну группу машин, достигших 49-дневного времени безотказной работы, они создали несколько скриптов для проверки своей теории. Тогда и обнаружилось, что Mac, который постоянно создавал новые соединения, просто перестал это делать без единой ошибки.
Затем команда обратила своё внимание на первопричину, поскольку она явно была связана с сетевым таймером. Они обнаружили, что виновником является внутренний счётчик «tcp_now», значение которого «обречено на переполнение». Функция tcp_now отслеживает текущее время с момента загрузки для стека TCP с точностью до миллисекунды. tcp_now представляется в виде 32-битного беззнакового целого числа, максимальное значение которого составляет 4 294 967 295 (2^32 - 1), после чего оно обнуляется. Поскольку отслеживаются миллисекунды, максимальное значение tcp_now составляет 4 294 967 секунд, или 49,7 дней.
Согласно стандартам, операционные системы собирают и удаляют
Читать на habr.com