Як виправити помилку у Node.js і ненавмисно підняти продуктивність в 2 рази

Почалося все з того, що я оптимізував віддачу помилки HTTP 408 Request Timeout в сервері додатків Impress, працюючому на Node.js. Як відомо, у нодовского http.Server є подія timeout, яке повинно викликатися для кожного відкритого сокета, якщо той не закрився за вказаний час. Хочу уточнити, що не для кожного запиту тобто не для кожної події request, функція якого має два аргументи (req, res), а саме для кожного сокета. Через один сокет може послідовно вчинити багато запитів у режимі keep-alive. Якщо ми задаємо це подія, через server.setTimeout(2 * 60 * 1000, function(socket) {… }) то повинні самі знищувати сокет socket.destroy(). Але якщо не встановити свій обробник, то http.Server має вбудований, який знищить сокет через 2 хвилини автоматично. На цьому самому таймауте можна віддати помилку 408 і вважати інцидент вичерпаним. Якби не одне але… З подивом я виявив, що подія timeout викликається і для тих сокетів, які підвисли і для вже отримали відповідь і для закритих клієнтської стороною, взагалі для всіх, що знаходяться в режимі keep-alive. Це дивна поведінка виявилося досить складним, і я розповім про це нижче. Можна було б вставити одну перевірку подія timeout, але зі своїм ідеалізмом я не втримався і поліз виправляти баг на рівень глибше. Виявилося, що в http.Server режим keep-alive реалізований не те що не по RFC, а відверто не дописаний. Замість окремого timeout для з'єднання і окремого keep-alive timeout, там все на одному таймауте, який реалізований на найшвидших псевдо-таймери (enroll/unenroll), але заданий за замовчуванням в 2 хвилини. Це було б не так страшно, якби браузери добре працювали з keep-alive і переиспользовали його ефективно або закривали б невикористовувані з'єднання.
Читати далі →

Що таке витоку пам'яті в android, як перевірити програму на їх відсутність і як запобігти їх появі

У цій статті для початківців android-розробників я постараюся розповісти про те, що таке «витоку пам'яті» в android, чому про них варто думати на сучасних пристроях, які виділяють з 192МБ на додаток, як швидко знайти і усунути ці витоку в малознайому додатку і на що потрібно звертати особливу увагу при розробці будь-якого додатку.


Кінцева мета статті — відповідь на просте питання:
Куди натиснути, щоб дізнатися, яку сходинку в додатку поправити?


Читати далі →