Re: Патч ETags в NixOS

2024-01-12 Пенетрантность izorkin
Добрый день, Максим.

Вы писали 13 января 2024 г., 3:28:36:

> Hello!

> Hash-сумма файла в качестве ETag - в целом отличное решение, 
> проблема тут ровно одна: её нужно как-то получить, ибо системный 
> вызов fstat() никаких hash-сумм почему-то не возвращает.  Считать 
> на лету - очевидно, плохой вариант для нагруженного сервера, так 
> как файл придётся на каждый запрос читать дважды.  А получать 
> hash-сумму откуда-то ещё, скажем из внешнего файла или 
> extended-атрибутов - выглядит в лучшем случае дополнительной фичей 
> (смотри https://trac.nginx.org/nginx/ticket/2351 например).

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

Если генерировать хэш-сумму на лету, то зачем надо генерировать её
каждый раз при повторном запросе? Можно же в кэше результат сохранить.
Да и это надо делать только для тех файлов, которые имеют нулевую дату.
А файлы в /nix/store меняются не часто, только при обновлении ОС.

Вариант с файлами хэш-сумм выглядит более оптимальным. При генерации
файлов в /nix/store можно дополнительно добавить возможность генерации
хэш-суммы для каждого файла, который требуется для работы сайта. Таким
же способом в некоторых приложениях организована генерация статических
файлов в gzip и brotli форматы.


-- 
С уважением,
 Izorkin  mailto:izor...@gmail.com
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: Патч ETags в NixOS

2024-01-12 Пенетрантность Maxim Dounin
Hello!

On Fri, Jan 12, 2024 at 10:35:38PM +0300, izor...@gmail.com wrote:

> Вы писали 9 января 2024 г., 5:26:08:
> 
> > Что до nix store, то кажется, что возвращение размера в ETag также 
> > должно проблему решить.
> 
> В том то и дело, что размер не всегда меняется.

Дата модификации и размер - на практике достаточная комбинация для 
отслеживания версий файлов и их различных представлений, по 
крайней мере в рамках тех представлений файлов, которые умеет 
возвращать nginx (исходный файл и его gzip-версия).

В nix store, в силу отказа от времени, время надо на что-то заменять, 
как минимум в ситуациях, когда полных путь, включающих store hash, 
не фигурирует в URL'е.  Но это ортогональный вопрос (и скорее 
вопрос к самой концепции, которая получилась не очень совместимой 
с HTTP).

> > Теоретически, наверное, можно пытаться в ETag вставлять какой-то 
> > идентификатор представления, то если для gzip_static добавлять в 
> > ETag что-нибудь вроде "...-gz".  Но при наличии размера в том же 
> > ETag'е смысла в этом исчезающие мало.
> 
> А вариант добавить вычисления простой хэш суммы при условии, что дата
> равно нулю - размер файла + хэш сумма.
> Теоретически на остальное не должно повлиять.

Hash-сумма файла в качестве ETag - в целом отличное решение, 
проблема тут ровно одна: её нужно как-то получить, ибо системный 
вызов fstat() никаких hash-сумм почему-то не возвращает.  Считать 
на лету - очевидно, плохой вариант для нагруженного сервера, так 
как файл придётся на каждый запрос читать дважды.  А получать 
hash-сумму откуда-то ещё, скажем из внешнего файла или 
extended-атрибутов - выглядит в лучшем случае дополнительной фичей 
(смотри https://trac.nginx.org/nginx/ticket/2351 например).

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: Патч ETags в NixOS

2024-01-12 Пенетрантность izorkin
Добрый вечер, Максим.

Вы писали 9 января 2024 г., 5:26:08:

> Что до nix store, то кажется, что возвращение размера в ETag также 
> должно проблему решить.

В том то и дело, что размер не всегда меняется.


> Полный путь к файлу в ETag точно не имеет смысла.  Более того, его 
> там быть точно не должно: если вдруг ресурс обслуживается двумя 
> разными origin-серверами, это приведёт к требованию совпадения 
> путей к файлу на этих серверах, а при их несовпадении - 
> соответственно к полным ответам вместе 304, то есть сломает 
> кэширование там, где оно сейчас работает.

Не подумал о таком варианте использования.


> Теоретически, наверное, можно пытаться в ETag вставлять какой-то 
> идентификатор представления, то если для gzip_static добавлять в 
> ETag что-нибудь вроде "...-gz".  Но при наличии размера в том же 
> ETag'е смысла в этом исчезающие мало.

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


-- 
С уважением,
 Izorkin  mailto:izor...@gmail.com
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность izorkin
Добрый вечер, Илья.
 
При условии в 2 пакета и 1 скачивание файла:
    614  29.6%  29.6%      614  29.6% __sendmsg
    551  26.6%  56.2%      551  26.6% _aesni_ctr32_ghash_6x
    298  14.4%  70.6%      298  14.4% __libc_pread64
    198  9.6%  80.2%      198  9.6% __memmove_avx_unaligned_erms
      65  3.1%  83.3%      65  3.1% epoll_wait
      39  1.9%  85.2%      39  1.9% __recvmsg
      16  0.8%  86.0%      114  5.5% ngx_quic_create_frame
      12  0.6%  86.5%      133  6.4% ngx_quic_recvmsg
      11  0.5%  87.1%      16  0.8% CRYPTO_gcm128_encrypt_ctr32
      10  0.5%  87.5%      10  0.5% __sendmmsg
 
При условии в 2 пакета и 2 скачивания файла:
    1222  31.9%  31.9%    1222  31.9% __sendmsg
    1072  28.0%  59.9%    1072  28.0% _aesni_ctr32_ghash_6x
    523  13.7%  73.6%      523  13.7% __libc_pread64
    413  10.8%  84.3%      413  10.8% __memmove_avx_unaligned_erms
      66  1.7%  86.1%      66  1.7% __recvmsg
      33  0.9%  86.9%      33  0.9% epoll_wait
      31  0.8%  87.7%      221  5.8% ngx_quic_create_frame
      31  0.8%  88.5%      218  5.7% ngx_quic_recvmsg
      20  0.5%  89.1%      20  0.5% __sendmmsg
 
При условии в 3 пакета и 1 скачивание файла:
    663  31.4%  31.4%      663  31.4% __sendmsg
    556  26.3%  57.7%      556  26.3% _aesni_ctr32_ghash_6x
    278  13.2%  70.9%      278  13.2% __libc_pread64
    205  9.7%  80.6%      205  9.7% __memmove_avx_unaligned_erms
      45  2.1%  82.8%      45  2.1% epoll_wait
      39  1.8%  84.6%      39  1.8% __recvmsg
      16  0.8%  85.4%      16  0.8% aesni_ctr32_encrypt_blocks
      12  0.6%  85.9%      123  5.8% ngx_quic_write_buffer
      11  0.5%  86.5%      11  0.5% __sendmmsg
 
При условии в 3 пакета и 2 скачивания файла:
    1212  31.2%  31.2%    1212  31.2% __sendmsg
      28.6%  59.8%      28.6% _aesni_ctr32_ghash_6x
    572  14.7%  74.5%      572  14.7% __libc_pread64
    361  9.3%  83.8%      361  9.3% __memmove_avx_unaligned_erms
      76  2.0%  85.8%      76  2.0% __recvmsg
      28  0.7%  86.5%      226  5.8% ngx_quic_recvmsg
      24  0.6%  87.1%      24  0.6% epoll_wait
      23  0.6%  87.7%      23  0.6% gcm_ghash_avx
      19  0.5%  88.2%      181  4.7% ngx_quic_create_frame
      18  0.5%  88.6%      18  0.5% __sendmmsg
 

-- 
С уважением,
 Izorkin                          mailto:izor...@gmail.com___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность Илья Шипицин
пт, 12 янв. 2024 г. в 15:16, :

> Добрый день, Илья.
>
>
> Этот метод будет работать при много-поточной загрузке, когда запрашивается
>
> сразу несколько разных файлов?
>
>
>
> Запустил тест в 2 потока, (запущен только 1 воркер) в итоге
>
> количество вызовов sendmmsg() увеличилось до 27 (без дополнительного
> патча).
>
> 1361  33.4%  33.4%1361  33.4% __sendmsg
>
>   27.3%  60.8%  27.3% _aesni_ctr32_ghash_6x
>
> 525  12.9%  73.7%  525  12.9% __libc_pread64
>
> 351  8.6%  82.3%  351  8.6% __memmove_avx_unaligned_erms
>
>   79  1.9%  84.2%  79  1.9% __recvmsg
>
>   38  0.9%  85.2%  239  5.9% ngx_quic_recvmsg
>
>   31  0.8%  85.9%  31  0.8% epoll_wait
>
>   27  0.7%  86.6%  27  0.7% __sendmmsg
>
>
>
> А вот с протоколом HTTP/1.1 такой трюк не сработал - второй запрос на
>
> скачивание ожидал завершение первого запроса. Не обращал раньше внимания
>
> на эту особенность. При 2-х воркерах тест в 2 потока сработал :)
>

а попробуйте изменить условие на 2 пакета

if (bytes > len * 3) {
/* require at least ~3 full packets to batch */
return 1;
}


>
>
> Вы писали 12 января 2024 г., 14:59:25:
>
>
>
> Это ожидаемо, если накапливается 1 пакет, его дорого отправлять через
> sendmmsg. Собственно, смысл проверки был в том, чтобы проверить,
> действительно ли пакеты (в вашем случае) не успевают накапливаться
>
>
>
> --
> С уважением,
>  Izorkin  mailto:izor...@gmail.com
> 
> ___
> nginx-ru mailing list
> nginx-ru@nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-ru
>
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность izorkin
Добрый день, Илья.

Этот метод будет работать при много-поточной загрузке, когда запрашивается
сразу несколько разных файлов?
 
Запустил тест в 2 потока, (запущен только 1 воркер) в итоге
количество вызовов sendmmsg() увеличилось до 27 (без дополнительного патча).
    1361  33.4%  33.4%    1361  33.4% __sendmsg
      27.3%  60.8%      27.3% _aesni_ctr32_ghash_6x
    525  12.9%  73.7%      525  12.9% __libc_pread64
    351  8.6%  82.3%      351  8.6% __memmove_avx_unaligned_erms
      79  1.9%  84.2%      79  1.9% __recvmsg
      38  0.9%  85.2%      239  5.9% ngx_quic_recvmsg
      31  0.8%  85.9%      31  0.8% epoll_wait
      27  0.7%  86.6%      27  0.7% __sendmmsg
 
А вот с протоколом HTTP/1.1 такой трюк не сработал - второй запрос на
скачивание ожидал завершение первого запроса. Не обращал раньше внимания
на эту особенность. При 2-х воркерах тест в 2 потока сработал :)
 
Вы писали 12 января 2024 г., 14:59:25:
 
> Это ожидаемо, если накапливается 1 пакет, его дорого отправлять через 
> sendmmsg. Собственно, смысл проверки был в том, чтобы проверить, 
> действительно ли пакеты (в вашем случае) не успевают накапливаться

 
-- 
С уважением,
 Izorkin                          mailto:izor...@gmail.com___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность Илья Шипицин
On Fri, Jan 12, 2024, 12:03  wrote:

> Добрый день, Илья.
>
>
> Первый вариант патча оказывается не рабочий, забыл применить:
>
> gcc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror
> -g  -I src/core -I src/event -I src/event/modules -I src/event/quic -I
> src/os/unix -I /nix/store/2ysp5ichpc$
>
> -o objs/src/http/ngx_http_file_cache.o \
>
> src/http/ngx_http_file_cache.c
>
> src/event/quic/ngx_event_quic_output.c: In function
> 'ngx_quic_allow_segmentation':
>
> src/event/quic/ngx_event_quic_output.c:249:36: error: variable 'len' set
> but not used [^[]8;;
> https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-but-set-variable$
>
>   249 | size_t  bytes, len;
>
>   |^~~
>
>
>
> Сработал такой патч:
>
> diff --git a/src/event/quic/ngx_event_quic_output.c
> b/src/event/quic/ngx_event_quic_output.c
>
> index 914d81921..27efc1950 100644
>
> --- a/src/event/quic/ngx_event_quic_output.c
>
> +++ b/src/event/quic/ngx_event_quic_output.c
>
> @@ -303,7 +303,7 @@ ngx_quic_allow_segmentation(ngx_connection_t *c)
>
> }
>
> }
>
>
>
> -return 0;
>
> +return 1;
>
>  }
>
>
>
> Теперь используется sendmmsg()
>
> 1065  36.0%  36.0%1065  36.0% _aesni_ctr32_ghash_6x
>
> 1018  34.4%  70.4%1018  34.4% __sendmmsg
>
> 268  9.1%  79.4%  268  9.1% __libc_pread64
>
> 175  5.9%  85.3%  175  5.9% __memmove_avx_unaligned_erms
>
>   58  2.0%  87.3%  58  2.0% epoll_wait
>
>   48  1.6%  88.9%  48  1.6% __memset_avx2_unaligned_erms
>
>   31  1.0%  90.0%  31  1.0% __recvmsg
>
>   15  0.5%  90.5%  120  4.1% ngx_quic_write_buffer
>
>   12  0.4%  90.9%  12  0.4% aesni_ctr32_encrypt_blocks
>
>   12  0.4%  91.3%  90  3.0% ngx_quic_create_frame
>
>   11  0.4%  91.7%  11  0.4% aesni_encrypt
>
>   8  0.3%  91.9%  24  0.8% EVP_CIPHER_CTX_ctrl
>
>   8  0.3%  92.2%8  0.3% __strcmp_avx2
>
>
>
> Но теперь скорость значительно упала, примерно с ~400 Мбайт/сек до ~250.
>
>
>

Это ожидаемо, если накапливается 1 пакет, его дорого отправлять через
sendmmsg. Собственно, смысл проверки был в том, чтобы проверить,
действительно ли пакеты (в вашем случае) не успевают накапливаться

Вроде в настройках сетевой карты gso включен:
>
> tx-gso-robust: off [fixed]
>
> tx-gso-partial: on
>
> tx-gso-list: off [fixed]
>
>
>
>
> --
> С уважением,
>  Izorkin  mailto:izor...@gmail.com
> 
> ___
> nginx-ru mailing list
> nginx-ru@nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-ru
>
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность izorkin
Добрый день, Илья.

Первый вариант патча оказывается не рабочий, забыл применить:
gcc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g  -I 
src/core -I src/event -I src/event/modules -I src/event/quic -I src/os/unix -I 
/nix/store/2ysp5ichpc$
        -o objs/src/http/ngx_http_file_cache.o \
        src/http/ngx_http_file_cache.c
src/event/quic/ngx_event_quic_output.c: In function 
'ngx_quic_allow_segmentation':
src/event/quic/ngx_event_quic_output.c:249:36: error: variable 'len' set but 
not used 
[^[]8;;https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-but-set-variable$
  249 |     size_t                  bytes, len;
      |                                    ^~~
 
Сработал такой патч:
diff --git a/src/event/quic/ngx_event_quic_output.c 
b/src/event/quic/ngx_event_quic_output.c
index 914d81921..27efc1950 100644
--- a/src/event/quic/ngx_event_quic_output.c
+++ b/src/event/quic/ngx_event_quic_output.c
@@ -303,7 +303,7 @@ ngx_quic_allow_segmentation(ngx_connection_t *c)
        }
    }
 
-    return 0;
+    return 1;
 }
 
Теперь используется sendmmsg()
    1065  36.0%  36.0%    1065  36.0% _aesni_ctr32_ghash_6x
    1018  34.4%  70.4%    1018  34.4% __sendmmsg
    268  9.1%  79.4%      268  9.1% __libc_pread64
    175  5.9%  85.3%      175  5.9% __memmove_avx_unaligned_erms
      58  2.0%  87.3%      58  2.0% epoll_wait
      48  1.6%  88.9%      48  1.6% __memset_avx2_unaligned_erms
      31  1.0%  90.0%      31  1.0% __recvmsg
      15  0.5%  90.5%      120  4.1% ngx_quic_write_buffer
      12  0.4%  90.9%      12  0.4% aesni_ctr32_encrypt_blocks
      12  0.4%  91.3%      90  3.0% ngx_quic_create_frame
      11  0.4%  91.7%      11  0.4% aesni_encrypt
      8  0.3%  91.9%      24  0.8% EVP_CIPHER_CTX_ctrl
      8  0.3%  92.2%        8  0.3% __strcmp_avx2
 
Но теперь скорость значительно упала, примерно с ~400 Мбайт/сек до ~250.
 
Вроде в настройках сетевой карты gso включен:
tx-gso-robust: off [fixed]
tx-gso-partial: on
tx-gso-list: off [fixed]
 
 
-- 
С уважением,
 Izorkin                          mailto:izor...@gmail.com___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность Илья Шипицин
On Fri, Jan 12, 2024, 11:29  wrote:

> Добрый день, Илья.
>
>
>
> Применил такой патч:
>
> diff --git a/src/event/quic/ngx_event_quic_output.c
> b/src/event/quic/ngx_event_quic_output.c
>
> index 914d81921..5f3720e7c 100644
>
> --- a/src/event/quic/ngx_event_quic_output.c
>
> +++ b/src/event/quic/ngx_event_quic_output.c
>
> @@ -297,10 +297,7 @@ ngx_quic_allow_segmentation(ngx_connection_t *c)
>
>
>
> bytes += f->len;
>
>
>
> -if (bytes > len * 3) {
>
> -/* require at least ~3 full packets to batch */
>
> -return 1;
>
> -}
>
> +return 1;
>
> }
>
>
>
>  return 0;
>
>
>
> Количество вызовов увеличилось до 14:
>
> 615  30.9%  30.9%  615  30.9% __sendmsg
>
> 547  27.5%  58.5%  547  27.5% _aesni_ctr32_ghash_6x
>
> 276  13.9%  72.3%  276  13.9% __libc_pread64
>
> 160  8.0%  80.4%  160  8.0% __memmove_avx_unaligned_erms
>
>   58  2.9%  83.3%  58  2.9% epoll_wait
>
>   39  2.0%  85.3%  39  2.0% __recvmsg
>
>   14  0.7%  86.0%  14  0.7% __sendmmsg
>
>
>
> Как сделать безусловный "return 1" в ngx_quic_allow_segmentation() не
> знаю.
>
>
>
"return 1:" первой строчкой в функции




>
> --
> С уважением,
>  Izorkin  mailto:izor...@gmail.com
> 
> ___
> nginx-ru mailing list
> nginx-ru@nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-ru
>
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность izorkin
Добрый день, Илья.
 
Применил такой патч:
diff --git a/src/event/quic/ngx_event_quic_output.c 
b/src/event/quic/ngx_event_quic_output.c
index 914d81921..5f3720e7c 100644
--- a/src/event/quic/ngx_event_quic_output.c
+++ b/src/event/quic/ngx_event_quic_output.c
@@ -297,10 +297,7 @@ ngx_quic_allow_segmentation(ngx_connection_t *c)
 
        bytes += f->len;
 
-        if (bytes > len * 3) {
-            /* require at least ~3 full packets to batch */
-            return 1;
-        }
+        return 1;
    }
 
     return 0;
 
Количество вызовов увеличилось до 14:
    615  30.9%  30.9%      615  30.9% __sendmsg
    547  27.5%  58.5%      547  27.5% _aesni_ctr32_ghash_6x
    276  13.9%  72.3%      276  13.9% __libc_pread64
    160  8.0%  80.4%      160  8.0% __memmove_avx_unaligned_erms
      58  2.9%  83.3%      58  2.9% epoll_wait
      39  2.0%  85.3%      39  2.0% __recvmsg
      14  0.7%  86.0%      14  0.7% __sendmmsg
 
Как сделать безусловный "return 1" в ngx_quic_allow_segmentation() не знаю.
 
 
-- 
С уважением,
 Izorkin                          mailto:izor...@gmail.com___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: nginxQuic: скорость загрузки при активации kTLS

2024-01-12 Пенетрантность Илья Шипицин
пт, 12 янв. 2024 г. в 08:13, :

> Добрый день, Илья.
>
>
> Может требуется ещё и поддержка recvmmsg()? Может поэтому
>
> не работает sendmmsg()?
>

есть подозрение, что упираетесь вот в это условие (не успевают накопиться 3
пакета)

if (bytes > len * 3) {
/* require at least ~3 full packets to batch */
return 1;
}


поэтому число вызовов sendmmsg варьируется (то 3, то 9).
попробуйте в это место дебага добавить ?

(еще есть бекдорный вариант, в ngx_quic_allow_segmentation() сделать
безусловный "return 1")


>
>
>
> --
> С уважением,
>  Izorkin  mailto:izor...@gmail.com
> 
> ___
> nginx-ru mailing list
> nginx-ru@nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-ru
>
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru