Это просто срань господня. Перетянул управление сессиями NNTP в отдельный модуль, и память волшебным образом перестала течь. По крайней мере, так сильно, как раньше. До этого с утреца к вечеру набегало 60-100 мегов в RES (фактически, js heap). Теперь с утра тьфу-тьфу, 20 мегабайт.
Сессия - объект с данными аутентификации, списком доступных гупп и т.п. Раньше я сессию пихал прямо в stream (нынешний socket, см документацию по ноде). Теперь сделал отдельную кучу, а в стриме храню только идентификатор. Почему раньше garbage collector сосал - ума не приложу. Весь код изучил вдоль и поперек - ну не должно там было возникнуть циклических ссылок.
Будем полировать дальше. Да, еще иногда демон тупо подвисает - я в курсе, и логи ошибок постоянно смотрю. Если падения не прекратятся вместе с утечками памяти, заведу monit, который будет процессы перезапускать при недоступности. Но не хотелось бы. Я искренне считаю, что нормальная программа должна обходиться без костылей.
Короче, JS не совсем тривиальная штука, хоть и удобная до жути. На веб-страничках некоторые ляпы совсем не заметны. А вот когда приложение должно работать месяцами и хреначить тонны байтов - вылезают всякие непонятности. Но я пока полон оптимизма. От идеи делать новые сервисы на ноде отказываться не планирую.
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"39c21abc3df9550077797d18":{"_id":"39c21abc3df9550077797d18","hid":349,"name":"Vitaly","nick":"Vitaly","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"4d3089e299707300771012da","hid":10923,"title":"Текучая память в node.js. Часть 2.","html":"<p>Это просто срань господня. Перетянул управление сессиями NNTP в отдельный модуль, и память волшебным образом перестала течь. По крайней мере, так сильно, как раньше. До этого с утреца к вечеру набегало 60-100 мегов в RES (фактически, js heap). Теперь с утра тьфу-тьфу, 20 мегабайт.</p>\n<p>Сессия - объект с данными аутентификации, списком доступных гупп и т.п. Раньше я сессию пихал прямо в stream (нынешний socket, см документацию по ноде). Теперь сделал отдельную кучу, а в стриме храню только идентификатор. Почему раньше garbage collector сосал - ума не приложу. Весь код изучил вдоль и поперек - ну не должно там было возникнуть циклических ссылок.</p>\n<p>Будем полировать дальше. Да, еще иногда демон тупо подвисает - я в курсе, и логи ошибок постоянно смотрю. Если падения не прекратятся вместе с утечками памяти, заведу monit, который будет процессы перезапускать при недоступности. Но не хотелось бы. Я искренне считаю, что нормальная программа должна обходиться без костылей.</p>\n<p>Короче, JS не совсем тривиальная штука, хоть и удобная до жути. На веб-страничках некоторые ляпы совсем не заметны. А вот когда приложение должно работать месяцами и хреначить тонны байтов - вылезают всякие непонятности. Но я пока полон оптимизма. От идеи делать новые сервисы на ноде отказываться не планирую.</p>\n","user":"39c21abc3df9550077797d18","ts":"2011-01-14T17:37:38.000Z","st":1,"cache":{"comment_count":0},"views":1579,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}