
Adel
02.11.2017
13:16:48
мне не нравится пхп тем, что он не статический :)

Dmitry
02.11.2017
13:16:51
ну... сколько нынче максимум на сервер... около 200 ядер?

Vladislav
02.11.2017
13:17:08
@miksir 8 ядер было у сервака, где снимали бенч.

Adel
02.11.2017
13:17:16
поэтмоу я последнее время изучаю ява-фреймворки..

Google

Dmitry
02.11.2017
13:17:44
8 ядер? "не верю" ;)

Vladislav
02.11.2017
13:17:57
@miksir 8 ядер.

Dmitry
02.11.2017
13:19:05
максимум вореров 20... хотя и это много... 100к запросов на воркер... 0.01мс на запрос?
или там был мультиплекс демон... хм... все-равно много

Maksim
02.11.2017
13:19:58
откуда взяться воркерам ещё)

Dmitry
02.11.2017
13:20:16
в смысле?

Maksim
02.11.2017
13:21:19
в смысле кто их создаёт эти самые воркеры

Dmitry
02.11.2017
13:21:50
а, ну я обычную схему fastcgi сервера рассматривал

Maksim
02.11.2017
13:22:05
не, нету её там
там что-то вроде реактовского tcp сервера, как я понимаю

Dmitry
02.11.2017
13:22:26
откуда ты знаешь, что есть в Владислава?

Maksim
02.11.2017
13:22:40
читаю что он пишет)

Dmitry
02.11.2017
13:23:26
а воркеры ну как откуда, треды ;)

Google

Dmitry
02.11.2017
13:23:40
или reuse

Vladislav
02.11.2017
13:23:50
Треды + libEvent + Ev.h (системный)
+ тюнинг ядра.
в потоках stream_select
каждый селект при этом яростно смотрит события

Dmitry
02.11.2017
13:24:47
но треды в линуксе почти что процессы... т.е. все-равно их много не наплодишь, на ядра оглядываться нужно

Vladislav
02.11.2017
13:25:40
правильно. Потому у меня порядка 24-28 воркеров. и при выходе на пиковую пропускную способность процы не уходят далее 80-90%
т.е. не впадает во фризы

Pavel
02.11.2017
13:26:10

Dmitry
02.11.2017
13:26:25
каждый воркер отрабатывает пачку соединений?

Vladislav
02.11.2017
13:26:34
это не костыль. Это имитация принципа потокового распределения в apache kafka

Pavel
02.11.2017
13:26:36
libevent работает противоположно stream_select

Dmitry
02.11.2017
13:27:00

Vladislav
02.11.2017
13:27:44
@chebotarevp они делают немного разные вещи. Я событиями сообщаю, что надо положить в тред. А селект уже разбирает что и кому обработать. Мне же надо как то дергать воркеры, в которые этот самый селект и происходит

Pavel
02.11.2017
13:28:31
Разница в направлении воркфлоу. при stream_select пользовательский код переьирает набор сокетов и каждый опрашивает, не случилось ли там события. А в libevent пользовательских код только регистрирует обработчики, и ядро само доставляет события на сокетах на них. Получается быстрее, и перебирать ничего не надо.

Dmitry
02.11.2017
13:29:02

Vladislav
02.11.2017
13:29:14
Лан, расскрою секрет. Логика работы написана на 7.2. Но обвязка сервера написана на Zephir Lang и позволяет мне при обработке не пересобирать байт-код и производить максимум работы в оперативке. Плюс у нас база данных реплицируется в inMemoryTables.
ну и прямой доступ к memalloc

Dmitry
02.11.2017
13:29:46
там в другом разница... в случае селекта тебе после кажого события нужно пачку сокетов сново в ядро отправлять... в этом огромный оверхед

Vladislav
02.11.2017
13:29:46
(malloc)

Google

Dmitry
02.11.2017
13:30:18
а в случае еполла ты один раз отправляешь пачку, и потом работаешь как со списком хранящимся в ядре

Vladislav
02.11.2017
13:30:35
@miksir огромный оверхед в данном случае компенсируется тем, что я могу из зефира делать напрямую time_wait соединение =)

Dmitry
02.11.2017
13:31:25

Pavel
02.11.2017
13:31:31

Dmitry
02.11.2017
13:32:34

Vladislav
02.11.2017
13:33:31
@miksir Я так извращаюсь как раз потому, что упарываюсь по ерлангу. но мне оч нравится пыха.

Pavel
02.11.2017
13:33:37
Формирует множество дескрипторов, потом над этим множествовм вызываешь сисколл select(). Он по ним и бегает.

Dmitry
02.11.2017
13:34:04

Pavel
02.11.2017
13:34:41

Dmitry
02.11.2017
13:34:44
если у тебя будет неблокирующий селект, т.е. с таймаутом в 0 - то у тебя просто ЦПУ будет жраться в цикле

Pavel
02.11.2017
13:34:59
Да

Pavel
02.11.2017
13:35:09
Но при этом скорость ответа возрастает ))

Dmitry
02.11.2017
13:35:29
гм... за счет чего?

Pavel
02.11.2017
13:36:20
Хотя, это как раз в epoll они выставляли 0 таймаут

Dmitry
02.11.2017
13:36:46
тут, возможно, другая проблема - работа с файлами...
насколько я помню, даже то подобие aio, что есть в линукс - не может быть загнано в epoll

Vitaliy Nameless
02.11.2017
13:40:31

Pavel
02.11.2017
13:41:11
Забыл как эта опция называется, но в linux есть она специально, когда нулевой таймаут, жрется процессор но время ответа на сокет минимально.

Dmitry
02.11.2017
13:42:19
есть, да... вопрос в том - с какими целями

Google

Dmitry
02.11.2017
13:43:57
как бы while(1) { epoll_wait(,,,-1); ... } ничем не хуже, а много лучше while(1) { epoll_wait(,,,0); ... }
но только если у нас нет операций, которые не попадают в еполл...

Adel
02.11.2017
13:45:57
последняя сотня сообщений явно не про пхп :)

Dmitry
02.11.2017
13:46:15
а это и не про пхп чат ;)

Pavel
02.11.2017
14:37:45
У заснувшего epoll тратится немного времени на разгон электронов в процессоре, когда приходит событие и будит его.

Admin
ERROR: S client not available

Dmitry
02.11.2017
15:05:35
нолики растут ;)
под нагрузкой 0.018, без нагрузки 0.105? ничего не напутал? ;)

Vladislav
02.11.2017
15:09:01

Dmitry
02.11.2017
15:09:54
ну 0.105 мс при 30 воркерах - это никак не 2 ляма... где-то на порядок меньше

Vladislav
02.11.2017
15:10:32

Dmitry
02.11.2017
15:11:09
ну, это около 10к зарпосов в секунду

Vladislav
02.11.2017
15:11:19
О_о

Dmitry
02.11.2017
15:12:31
шо? 1/0.000105 = 9523 :)

Vitaliy Nameless
02.11.2017
15:12:51
тогда верю

Pavel
02.11.2017
15:13:25
Собери докер контейнер чтобы можно было скачать и ручками потыкать
в 2 ляма в секунду даже на 8 ядрах и вусмерть оттюнингованном ядре верится слабо.
Если это там не внедрение в нулевое кольцо и в TCP стек.
И попадание в когерентность кеша.

Google

Vladislav
02.11.2017
15:15:53
С утра тестили на чистой сборке ubuntu-server (без тюнячек), вот лог:
Total data sent: 123640.4 MiB (129646334294 bytes)
Total data received: 852.8 MiB (894251446 bytes)
Bandwidth per channel: 43.513⇅ Mbps (5439.1 kBps)
Aggregate bandwidth: 59.616↓, 8642.922↑ Mbps
Packet rate estimate: 137211.4↓, 838519.4↑
значения собственно: {от} {до}

Dmitry
02.11.2017
15:16:52
ааа... где тут коннекты?

Vladislav
02.11.2017
15:16:53
в пике: 838519, на разогреве 137211

Dmitry
02.11.2017
15:17:06
аа... причем тут пакеты?

Vladislav
02.11.2017
15:17:44
потому, что тестировалось постоянное tcp соединение и мерились именно пакеты с валидным ответом.

Maksim
02.11.2017
15:18:01
бгг

Dmitry
02.11.2017
15:18:11
мдя...

Vladislav
02.11.2017
15:18:23
я же писал об этом выше..

Dmitry
02.11.2017
15:20:00
ну... под "запросы в секунды" обычно нечто другое подразумевается, да...

Pavel
02.11.2017
15:20:34
Да какая разница? Норм тащит

Dmitry
02.11.2017
15:20:40
ну у него и не пхп ;_

Pavel
02.11.2017
15:20:58
Правда если пошли извраты с тюнингом ядра и переписыванием на зефире, то может стоит переписать на go тогда

Vladislav
02.11.2017
15:21:11
ну запросы бывают разные.. Кто то имеет ввиду http, в нашем вот случае tcp.
Http запросы тоже замеряли: вот AB (обращаю внимание, что без тюнинга ос)
Requests per second: 208415.11 [#/sec] (mean)
Time per request: 0.960 [ms] (mean)
Time per request: 0.005 [ms] (mean, across all concurrent requests)

Dmitry
02.11.2017
15:21:48
не, tcp запросы в секунду и "число пакетов" - тоже немного разные штуки... ну в моем понимании

Vladislav
02.11.2017
15:21:56
8 ядер, одна виртуалка. Правда на базе собственного облака на open stack.

Dmitry
02.11.2017
15:22:20
вот если бы были udp запросы ;)

Vladislav
02.11.2017
15:22:23
@miksir Ок, сори, возможно не правильно выразился. Просто для меня пакет == запрос т.к. с пакетом приходит.. запрос =))