LINUX.ORG.RU
ФорумAdmin

nginx пишет маленькими чанками в сокет

 , ,


0

4

Привет, есть VPS, на котором nginx раздает статику и файлы, помимо этого там крутится и сам сайт

Не могу добиться максимальной пропускной способности, которую выделили на этот VPS

Начал с того, что крутил настройки nginx всяко разно, потом подкрутил sysctl, ничего не помогает

Начал смотреть на strace воркеров, и увидел странную вещь, воркеры пишут в файловые дескрипторы только по 16413 байт за 1 системный вызов, почему так?

Частичка вывода strace

epoll_wait(29, [{EPOLLOUT, {u32=526027040, u64=139844661184800}}], 512, 8) = 1
write(37, "3Q\233\201:z(\301\355\306\330\25f\342I`\321\236~\370\243\371\356-0h\250\330t\231Pm"..., 1328) = 1328
write(37, "\27\3\3@\30\302\v\240\3032\273\251\273\267F'+i\271\226\361-\264\347\202\337\375WeBE\250"..., 16413) = 16413
write(37, "\27\3\3@\30\302\v\240\3032\273\251\274\7\23\274\200\253H?%\3276\305\224\204\20T\f\202\25\253"..., 16413) = 16413
write(37, "\27\3\3@\30\302\v\240\3032\273\251\275v\260\241\223\250\303\353N*\202\310#\204\251\245\1\245}\324"..., 16413) = 16413
write(37, "\27\3\3@\30\302\v\240\3032\273\251\276\241\312\310\276\344\265]<\330\"\2016$\37\215\36\345x\3"..., 16413) = 16413
write(37, "\27\3\3@\30\302\v\240\3032\273\251\277\302<e\21\241\213A-\345\265\246\271v,w5c\225\200"..., 16413) = 16413
write(37, "\27\3\3@\30\302\v\240\3032\273\251\300\353O\204\36,\377\260\7\21\341\3L\307\345t\6\6\274\377"..., 16413) = 2739
write(37, "\206\241\34\342F\345\272\216\336\2@\27cE\204 )\211\261\3744\365\305Z\367O\276\nA\35(K"..., 13674) = -1 EAGAIN (Resource temporarily unavailable)
write(65, "\25\3\3\0\32\234\206\273\n(\224\346G\7\317\363<#\357~\242d\213\16\345\231\371\340vY\253", 31) = 31
close(65)                               = 0
epoll_wait(29, [{EPOLLOUT, {u32=526029921, u64=139844661187681}}], 512, 352) = 1
write(119, "s\243\6h\243\303-\317\344\0F\332\237<C\17\370\252\257\242\263\364\34\232=\302Y\177\4\177\241C"..., 5186) = 5186
write(119, "\27\3\3@\30\214\rA9=\216x\270\242Q\374\223\3\334\375@\357\276m\252\253o\372\rv7\6"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\271\365G\320\350[ \313\231\223\302\262O\302\202\246^:R_"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\272\311\274B'\372\262\24\277Ti5\245\7(q3ms\7"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\273s\363c5\16D\204(+\210,\2335zKN)\10\362"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\274\350\220&\330,Z\220_.\241\345\212\224\7\344\266\30\341\334"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\275\351\3642\374\355\30c\317C\356Aa\324\vj.\\\203\340"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\276.\313i\326*\303\271B\254\30159:\215\235#\265\16\274"..., 16413) = 16413
write(119, "\27\3\3@\30\214\rA9=\216x\277[\275\266\316$P\275\227\334\312\\\236\362\362R\242\261Q\227"..., 16413) = 8403
write(119, "i(\242\200\233\204\322\366J\342\3772\325U\261\23\26\215_\362\356q\221\214=?\314\235\345\263\30\374"..., 8010) = -1 EAGAIN (Resource temporarily unavailable)
epoll_wait(29, [{EPOLLOUT, {u32=526006400, u64=139844661164160}}], 512, 348) = 1
write(39, "\244\v\27\363\341\271\6\273\rt\"\236\200\305Z\v\261@8'\271\336#\373\n\247v\16~aY\267"..., 3180) = 3180
write(39, "\27\3\3@\30D\34\216\23\372\177\254\240\337\242\332\355\372\210.\260\f\22](\\\33PK'I\341"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\241\224\r5 \340`\223\305T\n\211*\203q\352\200\341\270l"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\242\234\273\242\23\373\2162\244\257M\0064\341\0160\37\262\242*"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\243\32\357 8\253M\306#?ub`\201\241t\25\277+\n"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\244\244h\267\313\32t\251\fw2\342\336I\375P\2121\263\201"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\245_\271\342\23\350\362V'\324\362\351g\322\360\255R=\34\321"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\246b\367\22\3004^.\351\3616\351&\352\266\333\5:\317I"..., 16413) = 16413
write(39, "\27\3\3@\30D\34\216\23\372\177\254\247\365#\365z\2154MQ\271\275w\3002c\204\335\24a3"..., 16413) = 9705
write(39, "\321\204\316\226k\210\340,_'q>\\\365K\210\2202:f\301\223,\267D\324\263A\326\16\2b"..., 6708) = -1 EAGAIN (Resource temporarily unavailable)

sysctl.conf:

net.core.netdev_max_backlog=10000
net.core.somaxconn=8192
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_wmem = 4096 65536 16777216
kernel.msgmnb = 65536

Ответ на: комментарий от t184256

Есть, но для nginx, как я понимаю, нужно 4.17, чтоб openssl 3.0 поставить (https://www.nginx.com/blog/improving-nginx-performance-with-kernel-tls/)

Я конечно же хочу обновить ядро, nginx и настроить sendfile_TLS, но сначала хотел бы понять, почему он пишет чуть больше 16кб за 1 вызов

jabba02
() автор топика

Да и пофиг, что не кратно 16к. Все равно ip-шный стек этот поток данных mtu-шные фрагменты разобьёт.

IMHO tls имеет свои накладные расходы.

vel ★★★★★
()

скорее всего это сделано для того чтобы равномерно распределялась нагрузка. т.е. когда одни клиенты массово начнут грузить большие файлы, у других клиентов не было задержек и тормозов.

Rost ★★★★★
()
Последнее исправление: Rost (всего исправлений: 1)
Ответ на: комментарий от Rost

Мой хороший друг глянул в код nginx, начали смотреть, нашли разве что коммент про хардкод 16КБ для отправки данных, когда используется TLS

А на счет равномерного распределения между клиентами - судя по strace он шлет одному клиенту бакетов 8 по 16КБ, после чего идет к другим, это то и раздражает, зачем делать лишние системные вызовы

Много чего попробовал, плюнул, буду обновлять ядро и юзать SSL_sendfile, посмотрим, что будет

jabba02
() автор топика
Ответ на: комментарий от jabba02

А на счет равномерного распределения между клиентами - судя по strace он шлет одному клиенту бакетов 8 по 16КБ, после чего идет к другим, это то и раздражает, зачем делать лишние системные вызовы

ядро тоже может раскидывать пакеты по ядрам. в этом суть асинхронщины - как можно быстрее отдать данные ядру и обрабатывать дальше, чтобы другие не ждали.

Rost ★★★★★
()