Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вот на винде, я понимаю, в WinAPI функция мультиплексирования select — не масштабируемая, и на прикладном уровне дает сложность o(n), что в принципе может создавать проблемы для 10 000 и больше соединений (или все-же справляется?), ну а у linux в чём беда?
erl -smp disable для эрланга и замерить как эрланг будет себя вести, если отключить расползание по процессорам.ulimit -n 999999typedef struct epoll_handler epoll_handler;
struct epoll_handler {
int (*fn)(epoll_handler*);
};
struct session {
int fd;
int events;
epoll_handler handler;
list timeouts_node; // intrusive list, 16B на 64бит
buf read_buf; // 24B на 64бит +- расход на недогруженые пакеты в пределах 64B
queue write_queue; // 16B на 64бит +- расход на пакеты для отправки
size_t write_offset;
int player_id;
}

node cluster уже как полгода доступен. Попробую выжать вечером побольше RPS из этого бенчмарка.libuv
Boost Asio
Pythin (ws4py)# Реализация Handshake Задержка Сообщений Соединений Таймаутов
# Erlang 4.008 3.595 203259 10000 0
# Go 2.291 1.289 204493 10000 0
# Perl 2.266 1.937 204526 10000 0
struct Object_X {
PositionAndVelocity *pv;
float temperature;
}
struct Object_Area {
Rect r;
float temperature;
Array<Object_X> xs;
}
struct Data {
Array<PositionAndVelocity> object_x_pvs;
Array<Object_X> xs;
Array<Object_Area> areas;
}
task_update_positions(Data *d) {
for (p in d->pvs) {
update_position(p);
}
};
@ depends(task_update_positions)
task_update_area_temperatures(Data *d) {
for (a in d->areas) {
update_area_temperature(a);
}
}
@ depends(task_update_area_temperatures)
simulate(Data *d) {};
Всё разбито на подзадачи, например: пересчитать положение объектов X, сделать действия Y которые зависят от положения объектов X, выполнить сложные действия, которые зависят от всех остальных задач итд. Дальше всё это естественно выстраивается в граф и планировщик начинает каждые 10мс запускать в тредах всё это хозяйство и уведомлять клиентов об изменениях на которые они подписаны.
./runtest results/java.dat 300 192.168.1.8 8000 10000
Running test with 10000 clients for 300 seconds
Data File: "results/java.dat"
escript: exception error: undefined function wsdemo_logger:new/1
in function runtest__escript__1339__771169__243679:main/1
in call from escript:run/2
in call from escript:start/1
in call from init:start_it/1
in call from init:start_em/1
erlang go python torna node.js
clients 2746 2851 2763 7002
handshakes 2744 2850 2761 2933
connection_timeouts 0 0 0 2728
messages_recv 555231 564177 519975 61927
handshake_time.median 75.666 13.107 162.254 2227.526
message_latency.median 447.559 486.75 2047.321 98011.552
crashes 0 0 0 0
erlang go py_tornado node.js
clients 10000 10000 10000 10000
handshakes 4285 3989 4594 1926
connection_timeouts 5478 4531 5406 8074
messages_sent 1015680 993991 1280922 556111
messages_recv 713854 776522 293795 179100
handshake_time.median 1657.051 24.955 993.679 1945.153
message_latency.median 40455.355 32573.558 98749.899 96158.056
crashes 0 0 0 0
C10k (Проблема 10000 соединений) на разных языках/платформах