Tag: node

Node 0.4 вышла. Проапдейтил NNTP

По поводу выхода стабильной node.js 0.4, выкатил ее на продакшен и плотно занялся вычисткой NNTP-гейта. Заборол 2 неочевидных косяка.

  1. Если кто пользуется напрямую связкой Server/Socket, то не надо пытаться в сокете ловить событие “connect”. Потому что оно устарело. Вся инициализация пишется прямо в listener сервера.

github.com/…/ad6db4af0b307445066eaae6ae43badd166e9…

После этого сразу заработали TLS-разновидности сокета и сервера.

  1. Поймал некислый race condition.

Предыстория такова. У NNTP протокол получается stateful. В HTTP соединения “короткие”, и авторизация делается каждый раз по кукам. В NNTP все не так - кук нет, коннекты могут быть по несколько минут, и авторизация надо помнить.

Ну я организовал объект сессии, а по разрыву соединения сессию грохал. И вот тут словил глюк, когда клиент рвал коннект в середине обмена. Система ведь асинхронная. Ответ может прийти с задержкой, когда его уже перестали ждать.

Вот и получалось иногда, что отвечалка пыталась лезть к удаленной сессии, вызывая эксепшен. Не особо фатально, но внутри мусор копился. Прока просто на всех callback-ах поставил проверок. Не очень нравится, но красивее пока не придумал. Как будет настроение - еще чего-нибудь порефакторю.

Заопенсорсил NNTP-гейт

Монетизировать NNTP совсем некогда, поэтому код пошел детям в приют:

github.com/rcdesign/vb-nntp

Проверил логи - работает более-менее стабильно. Не считая случая с DDoS, когда памяти не хватило и что-то внутри поехало. С 5 числа падений не было. За 10 дней только 4 странных эксепшена, которые изучу позже. Памяти наело с 13 мегабайт до 23. Будем считать, что не течет.

Да, кстати, вышла стабильная нода 0.4 с новым шустрым движком и кучей вкусностей. Как будет настроение - добью у гейта встроенный TLS, чтобы полностью отказаться от stunnel4.

Продолжаю мучать ноду

Еще раз “переиграл” исходники. Сделал ID сессии цифровым, в сквозные параметры функций перестал гонять сессию целиком, только ID. Вроде память течь перестала. Показатели похожи на нодовский демо-чат: 12-13 в heap. Странно конечно, что надо так сильно помогать garbage collector-у, но главное - результат.

Осталось разрулиться с подозрительными педениями процесса и непонятными пингами базы. В качестве временной меры прикрутил monit, который перезапускает упавшие процессы. Вполне годная штука оказалась. Теперь еще копирайты докрутить, и открою всем доступ к исходникам.

Текучая память в node.js. Часть 2.

Это просто срань господня. Перетянул управление сессиями NNTP в отдельный модуль, и память волшебным образом перестала течь. По крайней мере, так сильно, как раньше. До этого с утреца к вечеру набегало 60-100 мегов в RES (фактически, js heap). Теперь с утра тьфу-тьфу, 20 мегабайт.

Сессия - объект с данными аутентификации, списком доступных гупп и т.п. Раньше я сессию пихал прямо в stream (нынешний socket, см документацию по ноде). Теперь сделал отдельную кучу, а в стриме храню только идентификатор. Почему раньше garbage collector сосал - ума не приложу. Весь код изучил вдоль и поперек - ну не должно там было возникнуть циклических ссылок.

Будем полировать дальше. Да, еще иногда демон тупо подвисает - я в курсе, и логи ошибок постоянно смотрю. Если падения не прекратятся вместе с утечками памяти, заведу monit, который будет процессы перезапускать при недоступности. Но не хотелось бы. Я искренне считаю, что нормальная программа должна обходиться без костылей.

Короче, JS не совсем тривиальная штука, хоть и удобная до жути. На веб-страничках некоторые ляпы совсем не заметны. А вот когда приложение должно работать месяцами и хреначить тонны байтов - вылезают всякие непонятности. Но я пока полон оптимизма. От идеи делать новые сервисы на ноде отказываться не планирую.

Ни фига не понимаю, чего с памятью в node.js

Вроде косяки в NNTP зачистили, остались украшательства да код причесать. Но я напрочь не втыкаю, что там творится с памятью. При старте показывает VIRT 700 мб, RES 11 мб. За сутки RES вырастает до 80-100. С какой стати? 2 дня лопатил интернет, навтыкал везде где можно присваивание null, чтобы точно не было циклических ссылок. Отключил самопальный кеш, который пачками лепил setTimer. Вааще ни фига не меняется. Код тупой как пробка, там ломаться нечему. А Garbage Collector чудит, сцуко.

Может конечно дело в том, что я использую экспериментальную версию ноды, из третей ветки, а не стабильную двойку. Но все равно как-то странно. Есть еще вариант всех времен и народов - налепить чайлдов и временами их отстреливать. Но хотелось бы сначала разобраться, в чем дело.

Короче, нужна помощь зала. Если есть крютые спецы по жабаскрипту, или кто в тайне под ноду кодит - дайте знать.

Node.JS расковыриваем

Давно хотел понять, за что так хвалят Node.JS. А тут случай подвернулся, поручить в качестве тестового задания переписать NNTP-гейт с перла на ноду. Заодно сам краем глаза посматриваю документацию и исходники.

В качестве среды написания конечных автоматов (в частности, сетевых сервисов) - очень впечатляет. Буду думать, как прифигачить туда скрипты с интенсивной нагрузкой, типа аяксовых подсказок для поиска, гугломапов, чатов и т.п. Ведь если архитектура позволяет - можно обновлять страницу не раз в несколько секунд, а мгновенно, как на гугле.

Из грустного - при разрыве соединения со стороны клиента, демон иногда падает. Надо разбираться. Но все равно платформа очень соблазнительная.