Гоняю бенчмарки через их фреймворк. Прирост моего Nancy.Hosting.Event2 по сравнению с Nancy.Hosting.AspNet поверх mono-fastcgi-server в 10 раз при полной неразличимости настройки nginx-а.
когда я запустил NancyFx поверх xsp из их примера оно на первой паре тысяч запросов выдало 1200/в секунду, а потом сдулось до 300-400.
я дятел и неправильно тестировал вариант с NancyFx+HttpListener, он по факту выдаёт не 7500, а 3500, мой ab в комментарии выше замерял время ответа Bad Request
бакэнд с использованием libevent доведён до рабочего состояния. С ним результаты следующие:
Сам по себе без участия NancyFx сервер спокойно жуёт 17000-18000/сек (HttpListener в состоянии отдать 7000 plaintext за секунду), притом что nginx на той же машине с дефолтными настройками (700 соединений, 4 воркера) уприрается в 20000/сек.
При включении инфраструктуры NancyFx и JsonSerializer-а производительность падает до 6500/сек и остаётся стабильной.
Итого: Вариант с чистым HttpListener даёт выигрыш почти на порядок, libevent ещё удваивает.
По-хорошему надо соорудить тест для прогона с их фреймворком, пушто у меня в плане бенчмарков может быть что-то не так с окружением/настройками/версиями ПО.
Для интереса запустил у себя на ноуте (Core i5 второго поколения, 2.4 GHz) NancyFx поверх HttpListener с простым контроллером, возвращающим Json (через сериализацию) и натравил на него ab -c 100 -n 10000 напрямую. Получил показатель 7500 запросов в секунду. После этого верить в пиковые 2,346 на Core i7 в ваших тестах я отказываюсь, они либо nginx криво настроили, либо запускали приложение через xsp, а не напрямую, либо ещё какие-то косяки допустили, разбираться, если честно, лень.
Тем не менее NancyFx можно ещё сильнее разогнать, сделав хост поверх libevent, убрав таким образом оверхед от моновского I/O-стека, который работает не вполне оптимально (необходимость эмулировать виндовую модель заточенную под I/O Completion Ports даёт о себе знать). Возможно, я этим займусь в свободное время.
Ну у меня связка BLToolkit + NancyFX + самописный SCGI-хост для NancyFX + nginx перемалывает запросы со свистом, очень странно видеть такие показатели на таком железе. Возможно, стоило подкрутить размер пула потоков, подозреваю что упирается именно в то, что поток синхронно ждёт завершения запроса к БД, а поскольку весь стек обработки HTTP-запроса в managed-коде, банально некому заниматься обработкой новых.
В моём PPA есть 3.2.0 с установкой в /opt/mono-3. Правда, без xsp, целью было всё же завести свежие билды MonoDevelop. В принципе, мне на днях надо будет конфигурировать новую инсталляцию, могу заодно обновить это дело.
Карта очень простая — банальный граф с кривыми линиями между комнатами и возможностью таскать эти самые комнаты по карте для более удобного просмотра происходящего.
Т. е. выглядит примерно так (картинка нагуглена), но вместо кругов квадраты и точки соприкосновения на них фиксированы:
Значит, окружение одной комнаты описывается структурой из четырех байт, причем первый из них — это номер комнаты слева. Исходя из карты уровня, видно, что оставшиеся три байта описывают комнаты справа, сверху и снизу. Причем, если комната отсутствует, то на соответствующем месте будет стоять 0.
Исходя из этого я делаю вывод, что набор переходов из одной комнаты не связан с наборами переходов её соседей. То есть, можно сделать так, что, например, справа от первой комнаты вторая, слева от второй первая, но справа от второй вторая же. Таким образом сколько бы принц ни бежал направо, он будет оставаться во второй комнате. Но стоит из неё уйти налево — он снова окажется в первой. И это только простейший пример, можно строить безумные невозможные пространства с сжигающей мозг картой переходов.
А зачем надо было делать жёсткую сетку уровней? Намного занятнее было бы сделать возможность построения произвольных графов комнат. Например, как я понял из структуры, описывающей соседей, игра позволяет сделать туннель, который бесконечен в одном из направлений.
На текущем бенчмарке:
На моём хосте:
Не особо понятно, от чего так просело на предпоследнем тесте, вероятно, связано с моими манипуляциями на сервере на тот момент.
Сам по себе без участия NancyFx сервер спокойно жуёт 17000-18000/сек (HttpListener в состоянии отдать 7000 plaintext за секунду), притом что nginx на той же машине с дефолтными настройками (700 соединений, 4 воркера) уприрается в 20000/сек.
При включении инфраструктуры NancyFx и JsonSerializer-а производительность падает до 6500/сек и остаётся стабильной.
Итого: Вариант с чистым HttpListener даёт выигрыш почти на порядок, libevent ещё удваивает.
По-хорошему надо соорудить тест для прогона с их фреймворком, пушто у меня в плане бенчмарков может быть что-то не так с окружением/настройками/версиями ПО.
Тем не менее NancyFx можно ещё сильнее разогнать, сделав хост поверх libevent, убрав таким образом оверхед от моновского I/O-стека, который работает не вполне оптимально (необходимость эмулировать виндовую модель заточенную под I/O Completion Ports даёт о себе знать). Возможно, я этим займусь в свободное время.
Т. е. выглядит примерно так (картинка нагуглена), но вместо кругов квадраты и точки соприкосновения на них фиксированы: