Сайт на go работал около месяца без сбоев. Сегодня вдруг nginx начал выдавать 502 ошибку, на страницах, где работает GO в постоянном режиме. Посмотрел на историю изменений в файлах - изменений не было.
Ошибку устранил путём одной команды go build (пересобрав приложение). Сайт сразу же заработал.
В чём может быть проблема?
У самого только одна догадка - утечка памяти
Однако на тестовом сервере замечал вот такую ошибку, но она никаких "падений" не вызывала:
packets.go:130: write tcp 127.0.0.1:37104->127.0.0.1:3306: wsasend: An established connection was aborted by the software in your host machine.
Утечка памяти легко проверяется.
Когда начинается 502 просто смотрите сколько какие процессы жрут памяти.
Скажем, командой top операционной системы.
Если go сжирает ВСЮ доступную память на сервере - тогда да, это оно.
Если go сжирает много но еще куча свободной памяти в операционной системе - то это не оно, не утечка памяти, которую вы подозреваете.
У меня тоже есть сомнения, что утечка, т.к. вроде бы сборщик мусора у Go достаточно хорош. Может быть логи накрылись из-за этой ошибки:write tcp 127.0.0.1:37104->127.0.0.1:3306: wsasend: An established connection was aborted by the software in your host machine.
teub74:
Гоу придерживается концепции "сам программист что захочет, то и будет".
Всего 2 исключения из этого правила
1) Автоматическая сборка мусора, без участия программиста.
2) Автоматическое определение типов, в конструкциях типа "A:= 134.53"
Все остальное - должно обязательно реализовываться в ЯВНОМ виде самим программистом.
Как вариант - Гоу может писать panic в штатный stderr. Даже скорее всего так, не помню, надо проверять.
Но ловить ошибку из stderr и писать ее в какой-то файл должны вы сами (ну или это сделает та штука с помощью которой вы запускаете Гоу в вашем продакшене)
Может быть логи накрылись из-за этой ошибки:write tcp 127.0.0.1:37104->127.0.0.1:3306: wsasend: An established connection was aborted by the software in your host machine.
Может, у вас какие-нибудь хитрые оптимизации внутри сделаны для параллельной работы.
И оно заблокировало программу на Гоу.
То есть типичный deadlock между различными гоу-рутинами.
Я бы поискал проблему в районе каналов или мутексов - ну или как вы там внутри синхронизируйте.
Если вы используете для создания соединений стандартный пакет http из Гоу, то он автоматически на каждый входящий запрос создает новую Гоу-рутину.
А если вы этого не учитывайте и обращаетесь к общим НЕ РЕЕНТЕРАБЕЛЬНЫМ ресурсам без блокировки - то у вас жопа может возникнуть в непредсказуемый момент времени.
эта ошибка вызвана я так понял из-за падения пула с mysql
А почему вы не обрабатываете падение пула mysql в Гоу каким нибудь штатным способом.
Например, отдавать по http не тупо 502, а выдавать ответ с дополнительной диагностикой.