These are chat archives for NodejsRUS/chat

12th
Mar 2016
Михаил
@muxahuk
Mar 12 2016 03:33
Всем привет, вот уже часов 5 лажу по просторам инета и не могу найти ничего полезного что бы снизить нагрузку на ЦПУ и повысить производительность, вот на какой задаче:
Я открыл сокет содинение ( используя ws моудуль ) между клиентом ( фронтэнд ) и сервером ( nodejs ). Клиент шлёт данные на сервер каждые 40 млс. ( 10 клиентов нагружают ЦПУ сервера на 2% ) и я буквально ничего не делаю на сервере ( никак не обрабатываю принятие сообщений от клиента ). Я бы хотел отправлять объекты по сокету ( что-то типо {events: {width: 100, height: 100 }, target: 'какая-то строка' } ) т.к. нету такой функции как ObjectToBuffer или BufferToObject я подумал что могу сериализовать объект и отправлять строку, но используя JSON.stringify и JSON.parse нагружает сервер ещё больше ( до 4% при 10 пользователях ) и так мой вопрос: Есть ли какая-то альтернатива JSON.stringiify и JSON.parse ( типо BSON ), но которая менее требовательна к ЦПУ и более производительная нежели JSON ? или может есть какая-то библиотека, которая может сделать из объекта буффер и из беффера объект ( с условием что это будет быстрее, чем JSON ) ?
Oleg Bogdanov
@wormen
Mar 12 2016 08:16
@muxahuk чем отправка объекта не устраивает?
@muxahuk что касается использования ресурсов, смотри в коде, где накосячил, возможно где-то есть лишние высовы ...
используй EventEmmiter по максимуму, это уменьшит потребление ресурсов, а на сколько, это уже зависит от того, как ты пишешь
Михаил
@muxahuk
Mar 12 2016 12:01

@wormen в том то и проблема, что ничего не делая я получаю нагрузку 2% просто от того, что пользователь отправляет сообщения ( никак не обрабатываю вообще их ) и нагрузка в 4%, если отправляю сериализованный объект и на сервере паршу его...

const ws = require( 'ws' );
const socket = ws.createServer( { port: 11111 } );
socket.on( 'listening', () => {
    console.log( 'Socket server silstening on 1111' );
    socket.on( 'connection', ( client ) => client.on( 'message', ( message ) => JSON.parse( message ) )  ); // Если закоментировать - 2%, не комментируя эту строку - 4%
} );

пользователь:

var ws = new WebSocket( 'localhost:11111' );
ws.onopen = function() {
  setInterval( function() {
    ws.send( JSON.stringify( { events: { pageX: 111.1, pageY: 22.22 }, target: 'some string' } ) );
  }, 40 );
}
Михаил
@muxahuk
Mar 12 2016 12:15
new WebSocket( 'ws://localhost:11111' );*
Oleg Bogdanov
@wormen
Mar 12 2016 12:28
@muxahuk первый вопрос все еще актуален
@muxahuk и еще, чем socket.io не устраивает?
@muxahuk у меня просто есть пара парсеров на сокетах, и код там в разы сложнее, у них даже 1% CPU нагрузки нету
Михаил
@muxahuk
Mar 12 2016 12:30
@wormen т.е. на прямую ws.send( { evens: { pageX: 11.11, pageY: 22.22 }, target: 'some string' } ); - тем, что а сервер приходит Buffer и message === '[object Object]', хотя там есть flags.buffer который содержит какой-то буффер, но как его перевести обратно в объект я хз...
Oleg Bogdanov
@wormen
Mar 12 2016 12:31
@muxahuk юзай socket.io, там не надо будет ничего конвертировать, просто объект будешь передавать
Михаил
@muxahuk
Mar 12 2016 12:31
@wormen socket.io нагружает ЦПУ ещё сильнее, у него если просто отправлять объект ( 10 пользователей каждые 40 млс ) - нагрузка в 2 раза больше, чем у ws
Oleg Bogdanov
@wormen
Mar 12 2016 12:32

@muxahuk

socket.io нагружает ЦПУ ещё сильнее

не убедил

Михаил
@muxahuk
Mar 12 2016 12:34
@muxahuk ну.. я запускал 2 сервера, с одинаковыми условиями.. и просто говоря на клиенте var socket = io( 'localhost:22222' ); socket.emit( 'data', { ...} ); ( на сервере: const socket = socket( { options... } ); socket.listen( 22222 ); ) без какой-либо обработки ЦПУ нагружался почти в 2 раза сильнее, чем ws ( с закоментированной строкой )
Oleg Bogdanov
@wormen
Mar 12 2016 12:37

@muxahuk
1) ради интереса, посмотри нагрузку у log.io, он работает на socket.io
2) от себя скажу, что у меня сейчас работает 2 API сервиса с использованием socket.io, нагрузка там больше чем у тебя, а ресурсов использует практически нисколько

отсюда вывод, ты что-то не так делаешь

Михаил
@muxahuk
Mar 12 2016 12:40
@wormen я тебе скинул код, который сейчас стоит и нагружает ЦПУ.. единственное в чём у нас разница - у тебя АПИ скорее всего на серврере, а я на ПК тестирую.. Но у меня i3 3.5GHZ и как-бы на одном и том же ПК разница в ЦПУ есть используя сокет и ws..
Что я делаю не так ? весь код выше...
Dmitriy Simushev
@JustBlackBird
Mar 12 2016 14:18

А меня одного смутила вот эта фраза

Клиент шлёт данные на сервер каждые 40 млс.

это как бы 250 req/s
(для 10 клиентов)
может вместо непонятной оптимизации слать запросы чуть реже? ну или сервер по-мощнее взять, если частота сообщений принципиальна
Vadim Petrov
@imposibrus
Mar 12 2016 15:51
@wormen извините, но критическая масса "плохих советов" в ваших сообщениях сегодня уж слишком зашкаливает. давайте вспомним, что у socket.io под капотом - engine.io, а у того ws (если речь идет только о вебсокетах). абстракции добавляют нагрузку (лишние вызовы функций, и т.д.).
а вы смотрели "сырые" передаваемые данные socket.io? там кроме самих данных есть еще мета-информация. это еще один шаг в сериализации/десериализации. дальше можно продолжать обо всяких плюшках в socket.io, каждая из которых добавляет нагрузку.
@JustBlackBird соглашусь.
@muxahuk вы пробовали opt-in оптимизации для ws: utf-8-validate и bufferutil?
и на таких нагрузках самым быстрым из того, что может предложить JS будет... пам-пам... конкатенация строк)) (имеется ввиду отказаться от объектов, а оперировать только строками, но вы сами понимаете какой это ад). найти что-то быстрее JSON.parse и JSON.stringify вряд ли удастся.
можно, конечно, еще удариться в оптимизацию сервера. там покрутить, тут постучать. пару десятых процента сэкономите.
Ваня Devium
@webdevium
Mar 12 2016 17:23
Ьшпео66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666/66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
Dmitriy Simushev
@JustBlackBird
Mar 12 2016 18:50
@imposibrus что-то мне подсказывает, что пара десятых процента никого не спасет. Ведь кроме десериаллизации сервер должен выполнять еще какие-то действия с данными. почти наверняка код обработки данных окажется более ресурсоемким, чем нативная реализация JSON.parse.
По-моему все это слишком уж сильно отдает преждевременной оптимизацией
Kyrylo Yakovenko
@blia
Mar 12 2016 19:36
коты палятся
@webdevium ^
Ваня Devium
@webdevium
Mar 12 2016 21:22
@blia Сорри, реально коты. Я тут не при чем :)
Kyrylo Yakovenko
@blia
Mar 12 2016 21:49
@webdevium да все ок, у меня такие же.
Ваня Devium
@webdevium
Mar 12 2016 21:49
@blia у меня восемь))
Kyrylo Yakovenko
@blia
Mar 12 2016 21:50
@webdevium фак, дом хоть большой? У меня 3 и это ад.
Ваня Devium
@webdevium
Mar 12 2016 21:51
@blia однокомнатная квартира. + одна собака
Kyrylo Yakovenko
@blia
Mar 12 2016 21:52
сорри, не могу представить даже.
но понимаю
Ваня Devium
@webdevium
Mar 12 2016 21:52
та норм. Правда собака котов ест. Но как-то уже привык)
все таки создатели лиги защиты животных
Kyrylo Yakovenko
@blia
Mar 12 2016 21:52
ест на совсем?
Ваня Devium
@webdevium
Mar 12 2016 21:53
не совсем))) я бы ей готов был доплатить, чтоб всех съела))))))))))
Ваня Devium
@webdevium
Mar 12 2016 22:05
@blia Разговор есть, готов?
Ваня Devium
@webdevium
Mar 12 2016 22:23
@blia умер что ли?