Re: slice module + thread pools

2016-02-26 Пенетрантность Vadim Lazovskiy
2016-02-25 19:20 GMT+03:00 Maxim Dounin :

>
> Это выглядит как проблема при aio threads + sendfile + подзапросы.
> Workaround - выключить что-нибудь из списка.  Just for the record,
> воспроизводится с помощью тестов как-то так:
>
> TEST_NGINX_GLOBALS_HTTP="aio threads; sendfile on;" prove proxy_store.t
>

Наткнулся на странное поведение:
Если запустить в браузере просмотр видео через проксирующий nginx и
одновременно запросить этот же файл wget-ом,
закачка останавливается и соединение рвется по таймауту.
Внятный debug log собрать пока не удалось, хоть и проблема воспроизводится.

При отключении aio threads данной проблемы не наблюдается.

-- 
WBR,
Vadim Lazovskiy
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: slice module + thread pools

2016-02-25 Пенетрантность Vadim Lazovskiy
2016-02-25 19:20 GMT+03:00 Maxim Dounin :

> Патч:
>
> # HG changeset patch
> # User Maxim Dounin 
> # Date 1456417157 -10800
> #  Thu Feb 25 19:19:17 2016 +0300
> # Node ID 06da00f231e74bbb8dbb55fd6abd88ca8b207917
> # Parent  463609ba52b07e8e669d83ca7ca7fa754ae5355a
> Fixed sendfile in threads when used with subrequests.
>
> If sendfile in threads where used, it was possible that multiple
> subrequests will trigger multiple ngx_linux_sendfile_thread() calls,
> as operations are only serialized in output chain based on r->aio,
> that is, on subrequest level.
>
> This resulted in "task #N already active" alerts, in particular, when
> running proxy_store.t with "aio threads; sendfile on;".
>
> Fix is to tolerate duplicate calls, with an additional safety check
> that the file is the same as previously used.
>
> diff --git a/src/os/unix/ngx_linux_sendfile_chain.c
> b/src/os/unix/ngx_linux_sendfile_chain.c
> --- a/src/os/unix/ngx_linux_sendfile_chain.c
> +++ b/src/os/unix/ngx_linux_sendfile_chain.c
> @@ -354,6 +354,18 @@ ngx_linux_sendfile_thread(ngx_connection
>  return (ctx->sent == ctx->size) ? NGX_DONE : NGX_AGAIN;
>  }
>
> +if (task->event.active && ctx->file == file) {
> +/*
> + * tolerate duplicate calls with the same file;
> + * it can happen due to subrequests, as r->aio only serializes
> + * operations within a single subrequest
> + */
> +
> +*sent = 0;
> +
> +return NGX_OK;
> +}
> +
>  ctx->file = file;
>  ctx->socket = c->fd;
>  ctx->size = size;
>
>
Максим, спасибо. На первый взгляд патч работает. Завтра попробуем под
нагрузкой.

P.S.: может показаться, что я не умею пользоваться почтой. Похоже, это
действительно так. Прошу меня извинить ;)

-- 
WBR,
Vadim Lazovskiy
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: slice module + thread pools

2016-02-25 Пенетрантность Vadim Lazovskiy
2016-02-25 19:20 GMT+03:00 Maxim Dounin :
>
>
> Это выглядит как проблема при aio threads + sendfile + подзапросы.
> Workaround - выключить что-нибудь из списка.  Just for the record,
> воспроизводится с помощью тестов как-то так:
>
> TEST_NGINX_GLOBALS_HTTP="aio threads; sendfile on;" prove proxy_store.t
>
> Патч:
>
> # HG changeset patch
> # User Maxim Dounin 
> # Date 1456417157 -10800
> #  Thu Feb 25 19:19:17 2016 +0300
> # Node ID 06da00f231e74bbb8dbb55fd6abd88ca8b207917
> # Parent  463609ba52b07e8e669d83ca7ca7fa754ae5355a
> Fixed sendfile in threads when used with subrequests.
>
> If sendfile in threads where used, it was possible that multiple
> subrequests will trigger multiple ngx_linux_sendfile_thread() calls,
> as operations are only serialized in output chain based on r->aio,
> that is, on subrequest level.
>
> This resulted in "task #N already active" alerts, in particular, when
> running proxy_store.t with "aio threads; sendfile on;".
>
> Fix is to tolerate duplicate calls, with an additional safety check
> that the file is the same as previously used.
>
> diff --git a/src/os/unix/ngx_linux_sendfile_chain.c
> b/src/os/unix/ngx_linux_sendfile_chain.c
> --- a/src/os/unix/ngx_linux_sendfile_chain.c
> +++ b/src/os/unix/ngx_linux_sendfile_chain.c
> @@ -354,6 +354,18 @@ ngx_linux_sendfile_thread(ngx_connection
>  return (ctx->sent == ctx->size) ? NGX_DONE : NGX_AGAIN;
>  }
>
> +if (task->event.active && ctx->file == file) {
> +/*
> + * tolerate duplicate calls with the same file;
> + * it can happen due to subrequests, as r->aio only serializes
> + * operations within a single subrequest
> + */
> +
> +*sent = 0;
> +
> +return NGX_OK;
> +}
> +
>  ctx->file = file;
>  ctx->socket = c->fd;
>  ctx->size = size;
>




-- 
WBR,
Vadim Lazovskiy
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: slice module + thread pools

2016-02-25 Пенетрантность Maxim Dounin
Hello!

On Tue, Feb 23, 2016 at 11:22:45AM +0300, Vadim Lazovskiy wrote:

[...]

> Проблема 2 (aio включено slice включен):
> Если запустить  скачивание файла через прокси, скорость очень низкая,
> соединение постоянно разрывается. В логах при этом:
> 2016/02/23 10:36:11 [alert] 11124#11124: task #1 already active
> 2016/02/23 10:36:12 [alert] 11124#11124: task #4 already active
> 2016/02/23 10:36:14 [alert] 11124#11124: task #7 already active
> 2016/02/23 10:36:17 [alert] 11124#11124: task #10 already active
> 2016/02/23 10:37:59 [alert] 11124#11124: task #23 already active
> 2016/02/23 10:38:07 [alert] 11124#11124: task #35 already active
> 2016/02/23 10:38:17 [alert] 11124#11124: task #37 already active
> 
> Если отключить slice module, все становится хорошо.

Это выглядит как проблема при aio threads + sendfile + подзапросы.  
Workaround - выключить что-нибудь из списка.  Just for the record, 
воспроизводится с помощью тестов как-то так:

TEST_NGINX_GLOBALS_HTTP="aio threads; sendfile on;" prove proxy_store.t

Патч:

# HG changeset patch
# User Maxim Dounin 
# Date 1456417157 -10800
#  Thu Feb 25 19:19:17 2016 +0300
# Node ID 06da00f231e74bbb8dbb55fd6abd88ca8b207917
# Parent  463609ba52b07e8e669d83ca7ca7fa754ae5355a
Fixed sendfile in threads when used with subrequests.

If sendfile in threads where used, it was possible that multiple
subrequests will trigger multiple ngx_linux_sendfile_thread() calls,
as operations are only serialized in output chain based on r->aio,
that is, on subrequest level.

This resulted in "task #N already active" alerts, in particular, when
running proxy_store.t with "aio threads; sendfile on;".

Fix is to tolerate duplicate calls, with an additional safety check
that the file is the same as previously used.

diff --git a/src/os/unix/ngx_linux_sendfile_chain.c 
b/src/os/unix/ngx_linux_sendfile_chain.c
--- a/src/os/unix/ngx_linux_sendfile_chain.c
+++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -354,6 +354,18 @@ ngx_linux_sendfile_thread(ngx_connection
 return (ctx->sent == ctx->size) ? NGX_DONE : NGX_AGAIN;
 }
 
+if (task->event.active && ctx->file == file) {
+/*
+ * tolerate duplicate calls with the same file;
+ * it can happen due to subrequests, as r->aio only serializes
+ * operations within a single subrequest
+ */
+
+*sent = 0;
+
+return NGX_OK;
+}
+
 ctx->file = file;
 ctx->socket = c->fd;
 ctx->size = size;

-- 
Maxim Dounin
http://nginx.org/

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

Re: slice module + thread pools

2016-02-24 Пенетрантность Roman Arutyunyan
Здравствуйте Вадим,

On Tue, Feb 23, 2016 at 11:22:45AM +0300, Vadim Lazovskiy wrote:
> Здравствуйте.
> 
> Возникает проблема с отдачей данных из кэша при использовании связки slice
> module + aio treads.
> 
> Проблема 1 (aio выключено, slice включен):
> Если запустить скачивание файла через прокси, прервать на середине, а потом
> запустить заново, закешированная часть отдается медленно (5-8
> мегабайт/сек). Ежели докачать файл через прокси до конца, последующие
> запросы к нему происходят на максимальной скорости (1Gbps в тесте).

Зскешированная часть должна отдаваться быстро.  Убедитесь, что она действительно
закеширована и попробуйте скачать только закешированные слайсы при помощи
Range-запросов.

> С чем может быть связана медленная отдача закешированных слайсов?
> 
> Проблема 2 (aio включено slice включен):
> Если запустить  скачивание файла через прокси, скорость очень низкая,
> соединение постоянно разрывается. В логах при этом:
> 2016/02/23 10:36:11 [alert] 11124#11124: task #1 already active
> 2016/02/23 10:36:12 [alert] 11124#11124: task #4 already active
> 2016/02/23 10:36:14 [alert] 11124#11124: task #7 already active
> 2016/02/23 10:36:17 [alert] 11124#11124: task #10 already active
> 2016/02/23 10:37:59 [alert] 11124#11124: task #23 already active
> 2016/02/23 10:38:07 [alert] 11124#11124: task #35 already active
> 2016/02/23 10:38:17 [alert] 11124#11124: task #37 already active
> 
> Если отключить slice module, все становится хорошо.
> 
> С чем могут быть связаны данные проблемы?
> 
> Спасибо.
> 
> 
> Конфиг:
> 
> thread_pool pool_ssd01 threads=16;
> 
> proxy_cache_path /disks/ssd01 levels=1:2 keys_zone=cache_ssd01:4m
> use_temp_path=off inactive=7d max_size=230G;
> 
> split_clients $request_uri $disk {
> 100% ssd01;
> }
> 
> location /streams/ {
> location ~
> ^/streams/(?[^/]+)/(?.*)$ {
> if ($allowed = 0) {
> return 403;
> }
> 
> slice 10m;
> 
> aio threads=pool_$disk;
> 
> proxy_pass http://
> $upstream_hostname/$upstream_uri$is_args$args;
> proxy_set_header Host $upstream_hostname;
> proxy_set_header Range $slice_range;
> proxy_ignore_client_abort on;
> 
> proxy_cache cache_$disk;
> proxy_cache_key
> $upstream_hostname$upstream_uri$slice_range;
> proxy_cache_revalidate on;
> 
> proxy_cache_bypass $arg_start;
> proxy_no_cache $arg_start;
> 
> proxy_cache_lock on;
> proxy_cache_lock_age 60s;
> 
> proxy_cache_use_stale error timeout invalid_header
> updating http_500 http_502 http_503 http_504 http_403;
> }
> }
> 
> 
> # uname -a
> Linux localhost.localdomain 3.16.0-4-amd64 #1 SMP Debian
> 3.16.7-ckt20-1+deb8u3 (2016-01-17) x86_64 GNU/Linux
> 
> # /usr/sbin/nginx -V
> nginx version: nginx/1.9.11
> built by gcc 4.9.2 (Debian 4.9.2-10)
> built with OpenSSL 1.0.1k 8 Jan 2015
> TLS SNI support enabled
> configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx
> --modules-path=%{_libdir}/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-http_ssl_module --with-http_realip_module
> --with-http_addition_module --with-http_sub_module --with-http_dav_module
> --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module
> --with-http_gzip_static_module --with-http_random_index_module
> --with-http_secure_link_module --with-http_stub_status_module
> --with-http_auth_request_module --with-threads --with-stream
> --with-stream_ssl_module --with-http_slice_module --with-mail
> --with-mail_ssl_module --with-file-aio --with-http_v2_module
> --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat
> -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2'
> --with-ld-opt='-Wl,-z,relro -Wl,--as-needed' --with-ipv6
> 
> 
> -- 
> WBR,
> Vadim Lazovskiy

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


-- 
Roman Arutyunyan

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

Re: slice module + thread pools

2016-02-23 Пенетрантность Vadim Lazovskiy
23 февраля 2016 г., 11:22 пользователь Vadim Lazovskiy <
vadim.lazovs...@gmail.com> написал:

> Здравствуйте.
>
> Возникает проблема с отдачей данных из кэша при использовании связки slice
> module + aio treads.
>
> Проблема 1 (aio выключено, slice включен):
> Если запустить скачивание файла через прокси, прервать на середине, а
> потом запустить заново, закешированная часть отдается медленно (5-8
> мегабайт/сек). Ежели докачать файл через прокси до конца, последующие
> запросы к нему происходят на максимальной скорости (1Gbps в тесте).
>
> С чем может быть связана медленная отдача закешированных слайсов?
>
>
Уточнение.

Апстрим ограничивает скорость отдачи до 1Мбайт/сек.
slice module вместо того чтобы быстро собрать имеющиеся в кэше слайсы и
отправить их клиенту начинает запрашивать новые (отсутствующие?) у апстрима.
Как раз в этот момент и проседает скорость отдачи имеющихся слайсов.

-- 
WBR,
Vadim Lazovskiy
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: slice module + thread pools

2016-02-23 Пенетрантность Vadim Lazovskiy
>
>
> Проблема 1 (aio выключено, slice включен):
> Если запустить скачивание файла через прокси, прервать на середине, а
> потом запустить заново, закешированная часть отдается медленно (5-8
> мегабайт/сек). Ежели докачать файл через прокси до конца, последующие
> запросы к нему происходят на максимальной скорости (1Gbps в тесте).
>
> С чем может быть связана медленная отдача закешированных слайсов?
>
>
Уточнение.

Апстрим ограничивает скорость отдачи до 1Мбайт/сек.
slice module вместо того чтобы быстро собрать имеющиеся в кэше слайсы и
отправить их клиенту начинает запрашивать новые (отсутствующие?) у апстрима.
Как раз в этот момент и проседает скорость отдачи имеющихся слайсов.
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

slice module + thread pools

2016-02-23 Пенетрантность Vadim Lazovskiy
Здравствуйте.

Возникает проблема с отдачей данных из кэша при использовании связки slice
module + aio treads.

Проблема 1 (aio выключено, slice включен):
Если запустить скачивание файла через прокси, прервать на середине, а потом
запустить заново, закешированная часть отдается медленно (5-8
мегабайт/сек). Ежели докачать файл через прокси до конца, последующие
запросы к нему происходят на максимальной скорости (1Gbps в тесте).

С чем может быть связана медленная отдача закешированных слайсов?

Проблема 2 (aio включено slice включен):
Если запустить  скачивание файла через прокси, скорость очень низкая,
соединение постоянно разрывается. В логах при этом:
2016/02/23 10:36:11 [alert] 11124#11124: task #1 already active
2016/02/23 10:36:12 [alert] 11124#11124: task #4 already active
2016/02/23 10:36:14 [alert] 11124#11124: task #7 already active
2016/02/23 10:36:17 [alert] 11124#11124: task #10 already active
2016/02/23 10:37:59 [alert] 11124#11124: task #23 already active
2016/02/23 10:38:07 [alert] 11124#11124: task #35 already active
2016/02/23 10:38:17 [alert] 11124#11124: task #37 already active

Если отключить slice module, все становится хорошо.

С чем могут быть связаны данные проблемы?

Спасибо.


Конфиг:

thread_pool pool_ssd01 threads=16;

proxy_cache_path /disks/ssd01 levels=1:2 keys_zone=cache_ssd01:4m
use_temp_path=off inactive=7d max_size=230G;

split_clients $request_uri $disk {
100% ssd01;
}

location /streams/ {
location ~
^/streams/(?[^/]+)/(?.*)$ {
if ($allowed = 0) {
return 403;
}

slice 10m;

aio threads=pool_$disk;

proxy_pass http://
$upstream_hostname/$upstream_uri$is_args$args;
proxy_set_header Host $upstream_hostname;
proxy_set_header Range $slice_range;
proxy_ignore_client_abort on;

proxy_cache cache_$disk;
proxy_cache_key
$upstream_hostname$upstream_uri$slice_range;
proxy_cache_revalidate on;

proxy_cache_bypass $arg_start;
proxy_no_cache $arg_start;

proxy_cache_lock on;
proxy_cache_lock_age 60s;

proxy_cache_use_stale error timeout invalid_header
updating http_500 http_502 http_503 http_504 http_403;
}
}


# uname -a
Linux localhost.localdomain 3.16.0-4-amd64 #1 SMP Debian
3.16.7-ckt20-1+deb8u3 (2016-01-17) x86_64 GNU/Linux

# /usr/sbin/nginx -V
nginx version: nginx/1.9.11
built by gcc 4.9.2 (Debian 4.9.2-10)
built with OpenSSL 1.0.1k 8 Jan 2015
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx
--modules-path=%{_libdir}/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-http_ssl_module --with-http_realip_module
--with-http_addition_module --with-http_sub_module --with-http_dav_module
--with-http_flv_module --with-http_mp4_module --with-http_gunzip_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_stub_status_module
--with-http_auth_request_module --with-threads --with-stream
--with-stream_ssl_module --with-http_slice_module --with-mail
--with-mail_ssl_module --with-file-aio --with-http_v2_module
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat
-Werror=format-security -Wp,-D_FORTIFY_SOURCE=2'
--with-ld-opt='-Wl,-z,relro -Wl,--as-needed' --with-ipv6


-- 
WBR,
Vadim Lazovskiy
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru