
abc
04.04.2017
05:11:40
В emacs норм )

Константин
04.04.2017
05:30:13
юзал кто https://github.com/ninenines/ranch для tcp сокетов?

Alexander
04.04.2017
05:30:54
Ковбой использует это под капотом вроде

Константин
04.04.2017
05:31:00
это да

Google

Pavel
04.04.2017
05:31:00
да

Alexander
04.04.2017
05:31:06
А его используют более или менее все

Константин
04.04.2017
05:31:57
у меня непонимание tcp протокола или мозг не на месте.
Реализовал на эликсире вот этот пример https://github.com/ninenines/ranch/tree/master/examples/tcp_reverse
Вот так фигачу в него данные
спустя ровно 28312 успешных соединений начинает вываливаться в php ошибка PHP Warning: socket_recv(): unable to read from socket [107]: Transport endpoint is not connected
я так понимаю, что создаю слишком большое количество соединений и ranch тупо отсеивает их
Старт ранча
def start_link(port) do
{:ok, _} = :ranch.start_listener(
:teaser_view, 1024,
:ranch_tcp, [port: port],
TeaserView.Handler, []
)
end
Это хендлер, логика тупая до безобразия

pplcf
04.04.2017
05:37:46
какая ОС?

Alexander
04.04.2017
05:37:49
попробуй {max_connections, infinity}

Константин
04.04.2017
05:37:53
хыы,, видать никто не понял нифига)) Linux Mint

Google

pplcf
04.04.2017
05:38:02
сокеты иногда не сразу закрываются

Константин
04.04.2017
05:38:18
вот тоже думаю об этом.. и буфер переполняется

Alexander
04.04.2017
05:38:20
я думал что он сокеты не закрывает и тогда просто уперся в ос

pplcf
04.04.2017
05:38:28
между твоим socket_close и реальным закрытием
еще проходит некоторое время

Alexander
04.04.2017
05:38:53
я для подобного случая пересобирал в убунте чтобы ejabberd мог работать

Константин
04.04.2017
05:39:58
попробуй {max_connections, infinity}
Вот так делал еще
def start_link(port) do
{:ok, _} = :ranch.start_listener(
:teaser_view, 1000,
:ranch_tcp, [port: port, max_connections: 2048, backlog: 10000],
TeaserView.Handler, []
)
end
черт.. я даже эрланговый код научился читать нормально))))

Alexander
04.04.2017
05:40:55
примерно то о чем я говорил с джабером http://www.sundeepmachado.com/2016/03/how-to-tune-ejabber-server-to-handle.html
The linux machine needs to be tuned for handling a large number of connections.

pplcf
04.04.2017
05:41:21
можешь посмотреть количество TIME_WAIT коннекетов
TIME-WAIT state can exists on either server or client program. It represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request. The /proc/sys/net/ipv4/tcp_fin_timeout setting determines the time that must elapse before TCP/IP can release a closed connection and reuse its resources. This is known as TIME_WAIT state. TIME_WAIT is a normal part of the TCP connection. However, if you must close a socket in TIME_WAIT state, try:

Alexander
04.04.2017
05:42:35
net.ipv4.tcp_max_syn_backlog = 10240000
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000

Константин
04.04.2017
05:43:38
cat /proc/sys/net/ipv4/tcp_fin_timeout
60

pplcf
04.04.2017
05:44:15
ну вот, у тебя еще 60 секунд будет висеть твой сокет

Константин
04.04.2017
05:44:33
да.. круто)))
получается, что теперь только систему тюнить.
Я вот эти статьи смотрю https://dbeck.github.io/Wrapping-up-my-Elixir-TCP-experiments/ он вроде не тюнил ничего.

shadowjack
04.04.2017
07:14:17
Может просто не написал

Константин
04.04.2017
08:21:40
Да, я перепроверил. Ошибка пропадает ровно спустя 60 сек

Google

Константин
04.04.2017
08:21:57
т.е. сокеты остаются открытыми и не создаются новые
не понятно как тогда работает тот-же cowboy

Александр
04.04.2017
08:28:44
а ты разве с transport.setopts не сбрасываешь {reuseaddr, true} ?

Константин
04.04.2017
08:29:12
не понял, можешь подробнее?
я сейчас смотрю в сторону php для reuseaddress

Александр
04.04.2017
08:29:44
ну ты там в исходнике опции сокету меняешь
и по умолчанию reuseaddr включен, а у тебя его нет
как я понимаю это основная опция для того чтобы обрабатывать большое количество соеднинений

Константин
04.04.2017
08:31:37
так если он по умолчанию включен - то зачем его задавать?

Александр
04.04.2017
08:32:03
ну если setopts не добавляет опции, а переназначает, то ты его сбрасываешь
сейчас пытаюсь в исходниках посмотреть как это работает
пока не разобрался

Константин
04.04.2017
08:33:10
я уже и от этого отказался, упростил до усновного варианта
и тюнил tcp соединения в ОС
какая элементарная задача)))) ума не приложу как решить
нужно тупо передавать кучу данных из php в эликсир большим потоком

Александр
04.04.2017
08:35:41
большие нагрузки редко решаются элементарно

Константин
04.04.2017
08:36:08
но важно удостовериться в успешной передаче
rabbitMQ ведь так работает

Google

Константин
04.04.2017
08:36:47
гоню, у него протокол другой ведь

Александр
04.04.2017
08:38:09
ещё раз повторюсь - я ни разу не смог ПХПнёй нагрузить ерланг проекты на одном сервере
вот с кучи серверов - легко
у меня на эрланге - Riak CS и RabbitMQ

Rumata
04.04.2017
08:39:46

Константин
04.04.2017
08:39:46
In Erlang/OTP 19.0, UNIX Sockets are now available

Admin
ERROR: S client not available

Александр
04.04.2017
08:39:51
у вас в ПХП кроме соединений же ещё какая-то логика будет?

Константин
04.04.2017
08:39:54
чем черт не шутит))

Александр
04.04.2017
08:40:10
=)

Константин
04.04.2017
08:40:46
конечно будет
попробую через unix сокет, вроде даже быстрее должно работать
другое дело, что только локально
на внешний сервер не повесить тогда

Max
04.04.2017
08:43:11
пробросить unix сокет наружу через socat

Александр
04.04.2017
08:45:11
я думаю что производительность тестировать стоит на нагрузке приближенной к настоящей, а то получается "предварительная оптимизация" с усложнением архитектуры

Max
04.04.2017
08:46:54
конечно, оптимизировать надо только когда упёрся в это
из головы придумывать (((улучшения))) на ровном месте неэффективно

Константин
04.04.2017
09:01:21
вот давайте результат разложим
28к соединений он создает за 2 сек, потом висит 60 сек и продолжает создавать новые 28к соединений

Google

Константин
04.04.2017
09:02:01
я не знаю, почему он больше не может

shadowjack
04.04.2017
09:02:22
А на php стороне ты сокеты нормально закрываешь?

Константин
04.04.2017
09:03:26

shadowjack
04.04.2017
09:04:54
А попробуй socket_shutdown перед close

Константин
04.04.2017
09:05:53
такая-же песня)

shadowjack
04.04.2017
09:08:12
Хм... Ну тогда бери в руки tcpdump и смотри в какой момент тормоза
И нестатом посмотри что там творится

Pavel
04.04.2017
09:13:15
еще полезные команды линукса
ss -s
и в самом ерланге inet:i(). аналог нетстата

Константин
04.04.2017
09:17:26
Ровно 28232 соединений))
вот хоть тресни))
причем тачка то не виснет
видать это ограничение эрланга, сейчас туда смотрю

Pavel
04.04.2017
09:17:51
ss -s что показывает?

Александр
04.04.2017
09:18:53
http://www.linuxscrew.com/2011/02/15/quick-tip-port-range/
у тебя заняты все порты