Comments 15
Тесты - огонь! Посылаем полтора байта и ждём ответ, потому срываем покровы на хабре. Чем iperf не угодил?

А чем iperf поможет для организации IPC между плюсовым и PHP-шным приложениями? Изначально-то задача именно в этом стояла. А тут я решил детально разобраться, почему вариант "обмениваться через TCP сокеты" так странно себя ведёт.
У меня когда-то была обратная задача: собрать на минималистичном железе устройство для теста скорости. И из-за ограниченного объёма памяти для буфера приёма (микроконтроллер) мало что получилось. Хотя обмен данными по кабелю между ПК и устройством таки смог выжать почти 90МБит при TCP соединении.
А как получилось, что оно именно в память упиралось? Или там размер доступной памяти меньше чем MSS у TCP?
десятков тысяч rps так и не удалось достичь?
10 мс для сетевого пакета это ненормально долго. У вас принципиально что-то не так работает как должно.
Почитать бы где-нибудь на тему "а как оно правильнее всего делается".
Без учёта многопоточности конечно (т.е. оптимизируем именно обмен между двумя процессами, без попыток сэкономить CPU).
Или если мы тут упираемся в переключения контекста (система не отдаёт нам управление раньше, чем через 10мс) - тогда в таком варианте больше "выжать" не получится. Могу сказать, что у меня эксперимент не совсем чистый - на машине помимо этого теста много всякого крутится, потому это может влиять.
Или если мы тут упираемся в переключения контекста (система не отдаёт нам управление раньше, чем через 10мс)
Это не совсем так работает, "processor time slice" эффективен только при конкуренции за ресурсы ЦП, если есть свободное ядро - всё выполняется параллельно. Более того, это настраиваемый параметр. Но, не думаю, что в вашем случае это имеет значение.
То есть у вас сначала в канал уходит 4 байта длины, потом отдельным пакетом тело? Выглядит, как будто алгоритм Нагля как раз отключён и мелкие пакеты не группируются.
Вроде это основы — если вас интересует производительность, собирайте все, что нужно отправить, в одну операцию send.
net.ipv4.tcp_low_latency=1 сделает то что вы хотите. Или можно попроверять профили tuned, где есть в названии latency.
Ну и классическое
"после починки проблем с ACK"
Это не баг, это фича
Когда переподключения ускоряют работу по сети. Разбираемся с быстродействием TCP-сокетов