--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
185.*.*.146 - - [18/Mar/2017:09:35:23 +0000] "POST /api/v1/calculate HTTP/1.1" 200 945 "-" "-" "-" 911 0.009 0.000 0.009
185.*.*.164 - - [18/Mar/2017:09:35:23 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1322 "-" "-" "-" 1289 0.008 0.001 0.008
185.*.*.195 - - [18/Mar/2017:09:35:23 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1346 "-" "-" "-" 1313 0.010 0.001 0.010
185.*.*.129 - - [18/Mar/2017:09:35:23 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1335 "-" "-" "-" 1302 0.007 0.000 0.006
...
185.*.*.100 - - [18/Mar/2017:09:35:24 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1371 "-" "-" "-" 1342 0.009 0.000 0.009
185.*.*.104 - - [18/Mar/2017:09:35:24 +0000] "POST /api/v1/calculate HTTP/1.1" 200 957 "-" "-" "-" 926 0.008 0.000 0.008
185.*.*.185 - - [18/Mar/2017:09:35:24 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1368 "-" "-" "-" 1320 0.009 0.000 0.009
185.*.*.178 - - [18/Mar/2017:09:35:24 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1338 "-" "-" "-" 1304 0.007 0.000 0.007
185.*.*.227 - - [18/Mar/2017:09:35:24 +0000] "POST /api/v1/calculate HTTP/1.1" 200 962 "-" "-" "-" 928 0.006 0.000 0.006
185.*.*.130 - - [18/Mar/2017:09:35:24 +0000] "POST /api/v1/calculate HTTP/1.1" 200 1350 "-" "-" "-" 1313 0.007 0.000 0.007
# cat access.log-20170318 | grep "17/Mar/2017:03:42:17" | awk '{ print $15,$16 }' | sort | uniq -c
2056 0.000 0.000
200 0.001 0.000
1313 0.001 0.001
3 0.002 0.001
9 0.002 0.002
5 0.003 0.003
3 0.004 0.004
4 0.005 0.005
5 0.006 0.006
4 0.007 0.007
2 0.008 0.007
5 0.008 0.008
1 0.009 0.009
Интересно. Под подозрением: nginx, сетевой стек, планировщик ядра, железо и приложение. Проверить, наверное, проще всего сеть. Посмотрите tcpdump - между чем и чем тормоза появляются?
Главный вопрос: а вам вообще там nginx нужен?
И даже если он там действительно нужен, почему не используется keep_alive до апстрима?И всё-таки, скорее всего действительно не нужен.А тайминги даже на одной машине могут возникнуть:- из-за шедулинга процессов (ты не забыл разнести nginx и гошку на разные ядра?)
- из-за не мгновенного accept (если ты забыл сделать keep_alive до апстрима)
# cat access.log-20170318 | grep "17/Mar/2017:03:42:17" | awk '{ print $15,$16 }' | sort | uniq -c
2056 0.000 0.000
200 0.001 0.000
1313 0.001 0.001
3 0.002 0.001
9 0.002 0.002
5 0.003 0.003
3 0.004 0.004
4 0.005 0.005
5 0.006 0.006
4 0.007 0.007
2 0.008 0.007
5 0.008 0.008
1 0.009 0.009
- из-за шедулинга event_loop в nginx
- из-за шедулинга event_loop в go
- из-за шедулинга внутриядерных нотификаций для epoll
В общем, чем больше общающихся процессов, тем больше тайминги, даже на одной машине.Хочешь уменьшать тайминги для пользователя? Убирай лишние процессы (nginx).
А ты проверь. Сделай кипалив до апстрима.
Установка соединения - длительная операция. После чего epoll уведомляет о новом соединении. Потом event-loop в цикле зовет accept, порождая по горутине на каждый коннект (а может и не одной).
А замер внутри хэндлера не видит ни accept, ни read запроса, ни write ответа. Он живёт в своем уютном маленьком мирке.
Еще, конечно, 32 ядра "пугают". Это один сокет? Т.е. есть NUMA, или нет? Правда, тогда и GC должен был бы под тормаживать.
Но вполне возможно, что горутины, порожденные на accept коннекта, складываются в очередь того же екзекютера. И чтобы другое ядро (экзекютор) могло украсть эту горутину , тоже уходит время. Опять таки, в этом случае keepalive может помочь (заодно будет повод говорить, что nginx нужен).
Кстати, советую все-таки прибивать гошку и nginx на разные ядра (используя taskset).
--
Вы получили это сообщение, поскольку подписаны на группу Golang Russian.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.