Re: Почему статические файлы (20Кб) в локальной сети(1Gbit/s) отдаются 1,5 секунды?

2018-07-06 Пенетрантность YuriN
> Показатель TTFB (time to first byte) при отсутствии каких-либо тормозов
на сервере должен быть около двух задержек (rtt) от сервера к клиенту.
Но если в этот показатель включается время ssl-ного хендшейка, то он может
быть существенно выше, т.к. включает тяжёлую криптографию и зависит от
скорости шифрования на клиенте и на сервере. Как измеряется этот TTFB
и каково реальное значение rtt?

Измеряется при помощи DeveloperTools в Chrome.
Вот скриншот
https://i.snag.gy/XSY3Rm.jpg

rtt, если замерять пингом сейчас при размере пакета 56 байт:
64 bytes from xx.yy.zz.ww: icmp_seq=0 ttl=51 time=12.021 ms
64 bytes from xx.yy.zz.ww: icmp_seq=1 ttl=51 time=11.656 ms
64 bytes from xx.yy.zz.ww: icmp_seq=2 ttl=51 time=13.301 ms
64 bytes from xx.yy.zz.ww: icmp_seq=3 ttl=51 time=13.470 ms
64 bytes from xx.yy.zz.ww: icmp_seq=4 ttl=51 time=12.245 ms
(в данный момент замеры не внутри локальной сети, а по интернету, однако
вообще никакой разницы в производительности не наблюдалось когда сервер
nginx был в одной локальной сети (1Гб/с у обоих, клиента и  сервера) с
браузером)

>Вы пишете, что TTFB порядка 200-300 ms, а ниже, что заказчка целого файла
занимает целых 27 ms. Здесь явно противоречие, причём на порядок.
Здесь нюанс:
При 80 запросах - время закачки каждого из файлов по отдельности 1-1.5 сек.
При 1 единственном запросе - время закачки одного файла 23 ms (это тот же
файл, к-ый присутствует в предыдущих 80-и запросах)

TTFB варьируется и это нормально - т.е. если не было файла в кэше, конечно
TTFB будет больше (пока nginx заберёт файл с upstream или пока считает его с
диска)
TTFB мы даже не рассматриваем, он вполне себе нормальный.
А вот доставка ответа от nginx до браузера феноменально тормознутая. При
чём, как я говорил уже, без разницы в локальной сети nginx c браузером
находится или нет.

> Какова получается скорость загрузки по http без ssl?
Без  ssl время отдачи каждого запроса сократилось примерно на 50мс.

И сегодня большинство запросов уже по полсекунды обрабатываются, вместо
вчерашней секунды! (при том что я не менял какие-то настройки)
Также я заметил есть пара файлов ( SVG картинки менее 1кб) - они стабильно
грузятся 1 секунду (при том что точно берутся из кэша). 
https://i.snag.gy/Yuczp3.jpg

> В дампе, при подозрении на потери в канале, прежде всего следует искать
пакеты с селективными подтверждениями (sack), 
Сделал фильтр по tcp.options.sack.count - Wireshark показал множество таких
пакетов.
Скажем я снимал дамп секунд 10 (время загрузки титульной страницы сайта) и 
за это время в дампе оказалось 285 пакетов с SACK из 2284 суммарно.
Что с этим можно сделать?

>Разумеется, нужно убедиться, при tcp-шном хендшейке что обе стороны
договорились эту опцию использовать.
handshake’а нет в этом дампе, смогу написать несколько позже о том, что
происходит нём.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,280414,280435#msg-280435

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Почему статические файлы (20Кб) в локальной сети(1Gbit/s) отдаются 1,5 секунды?

2018-07-05 Пенетрантность YuriN
Виталий, спасибо за ответ.

Да, тупит на стороне nginx'а. Я же написал: TTFB = быстрый, все файлы уже на
диске сервера nginx, в директории указанной в proxy_cache_path лежат. Он
проксирует и кэширует исправно (видно что файлы берутся из его кэша, т.к.
upstream_response_time = 0, но почему так медленно в браузер отдаёт ответ не
ясно.

>Соберите tcp трейс на стороне сервера и посмотрите сколько времени реально
уходит у nginx'а и нет ли tcp retry в сторону клиента.
Собирал. Смотрел Wireshark'ом - есть несколько TCP ACK Duplicates (от
клиента)

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,280414,280416#msg-280416

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Почему статические файлы (20Кб) в локальной сети(1Gbit/s) отдаются 1,5 секунды?

2018-07-05 Пенетрантность YuriN
Добрый день!

Имеем очень медленную отдачу закэшированной статики. Посоветуйте пожалуйста
как можно ускорить работу.

Статика, скажем, размером 20kb отдаётся порядка 1-1.5 секунды. При чём TTFB
относительно быстрый - 200-300 ms, а доставка от nginx до браузера уже 1-1.5
секунды.  По логам видно, что эта статика берётся из кэша всё-таки
($upstream_response_time = 0).
Условия проверки: обращение к титульной странице нашего сайта - это 80
запросов, 2.7Mb трафика суммарно, по https, http2.
Конфиг вроде бы стандартный, без особого тюнинга (приложен)
Если скачивать один только статический файл (1 запрос) - то он скачивается
без этих задержек - 27 ms. 

Топология:
nginx-сервер в нашей конфигурации является проскирующим и кэширующим
сервером:
кэширует статику с сервера приложений, к-ый расположен в этой же локальной
сети.

Ошибок на сетевых интерфейсах клиента и сервера нет. Каналы не перегружены.
(Пропускная способность 1Гбит/с), И в момент обращения к nginx - загрузка
максимум 5Mbit/s). В лимиты  ЦПУ/память/ дисковый I/O /сеть не упираемся
судя по vmstat, top, atop, zabbix. Хотя очевидно есть какое-то ограничение,
про к-ое мне пока неизвестно. 
8 ядер, 8Gb RAM, Load average 0.00, 0.00, 0.00

В error логах пусто, строки о nginx: [warn] the "ssl" directive is
deprecated, use the "listen ... ssl" directive instead in /etc/nginx/conf.d/
не считаю важными.

Также я пробовал размещать proxy_cache_path на tmpfs (в ОЗУ) - не дало
никакого прироста.

nginx последний stable, из оффициального репозитория nginx.org

Я проверял в разных сетях (с разным коммутационным оборудованием), на разных
физических серверах, на разных дистрибутивах Linux.


_

Версии ПО  и конфиги  :
root@proxy4:~# uname -a
Linux proxy4 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018
x86_64 x86_64 x86_64 GNU/Linux
nginx 1.14.0-0ubuntu1
дефолтовые  настройки  sysctl
root@proxy4:~# lsb_release -a
Description:Ubuntu 18.04 LTS
root@proxy4:~# nginx -V
nginx version: nginx/1.14.0
built by gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
built with OpenSSL 1.1.0g  2 Nov 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx
--with-compat --with-file-aio --with-threads --with-http_addition_module
--with-http_auth_request_module --with-http_dav_module
--with-http_flv_module --with-http_gunzip_module
--with-http_gzip_static_module --with-http_mp4_module
--with-http_random_index_module --with-http_realip_module
--with-http_secure_link_module --with-http_slice_module
--with-http_ssl_module --with-http_stub_status_module --with-http_sub_module
--with-http_v2_module --with-mail --with-mail_ssl_module --with-stream
--with-stream_realip_module --with-stream_ssl_module
--with-stream_ssl_preread_module --with-cc-opt='-g -O2
-fdebug-prefix-map=/data/builder/debuild/nginx-1.14.0/debian/debuild-base/nginx-1.14.0=.
-specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong
-Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC'
--with-ld-opt='-Wl,-Bsymbolic-functions
-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now
-Wl,--as-needed -pie'


/etc/nginx/nginx.conf 

user  www-data;
worker_processes  8;
error_log  /var/log/nginx/error.log;
pid/var/run/nginx.pid;
events {
worker_connections  4000;
}
worker_rlimit_nofile 20;
http {
client_max_body_size 10m;
charset utf-8;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:512m;
include   /etc/nginx/mime.types;
default_type  application/octet-stream;
log_format  main  '$remote_addr - $remote_user [$time_local] "$request"
'
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"
$upstream_response_time';
access_log  /var/log/nginx/access.log  main buffer=16k;
server_tokens off;
client_body_buffer_size 128k;
keepalive_requests 1000;
sendfileon;
sendfile_max_chunk 512k;
proxy_buffering on;
open_file_cache max=20 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
keepalive_timeout  65;
include /etc/nginx/conf.d/*.conf;
}


/etc/nginx/conf.d/beta.domain.ru.conf

proxy_cache_path /tmp/nginx_CACHE_ZONE keys_zone=CACHE:2048M;
proxy_temp_path  /tmp/nginx_temp;
upstream backend {
server 195.209.xx:80;
}
upstream backend_old {
server