Добрый день!
У меня ряд серверов раздают большие фильмы и диски изрядно и постоянно
нагружены. Решил воспользоваться двумя советами, чтобы облегчить им жизнь.
Freebsd 6.3 nginx/0.7.21 sendfile on;
для начала пересобрал ядро с MAXPHYS=1024*1024 и поднял kern.ipc.sfreadahead
- заметно полегчало.
параллельно на другом сервере отформатировал винчестеры с блоком 64kb - тоже
появился прирост на 30%, но там не nginx.
Воодушевленный решил скрестить оба метода.
Отформатировал все винчестеры с блоком 64kb и тут случилась засада. nginx в
жестком biord! все тормозит, скорость упала в два раза.
смотрю iostat:
tty ad4 ad6 da0 cpu
tin tout KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s us ni sy in id
0 233 64.00 90 5.62 64.00 54 3.37 280.25 8 2.19 4 0 11 15 70
0 78 64.00 91 5.68 64.00 53 3.31 218.12 16 3.40 3 0 8 20 70
0 78 64.00 85 5.31 64.00 67 4.18 288.00 14 3.25 1 0 13 17
69
0 78 64.00 90 5.62 64.00 62 3.87 189.29 17 3.14 2 0 12 17 68
0 78 64.00 91 5.68 64.00 56 3.50 151.58 33 4.88 2 0 9 18 70
0 78 64.00 82 5.12 64.00 54 3.37 139.28 36 4.89 2 0 11 18 68
0 78 64.00 89 5.56 64.00 60 3.75 245.82 22 5.28 2 0 8 16 73
Первые два - SATA, третий - системный скази, раздают все. Системный конечно
переформатированию не подвергался.
Вопрос - почему у всех винтов отформатированных с блоком 64kb, KB/t
стабильно - 64.00 и плавают только tps? А у системного KB/t - заметно
поприличнее!
Но это когда работает только nginx, запускаю mc и копирую файл с диска на
диск, несмотря на то что gstat говорит 90% занятости, файл копируется легко
в 20+мег в секунду, а iostat показывает следующее:
0 358 512.00 108 53.95 0.00 0 0.00 512.00 108 53.95 4 0 11 2 83
0 331 512.00 105 52.45 0.00 0 0.00 512.00 105 52.45 2 0 11 1
86
0 491 512.00 108 53.95 0.00 0 0.00 512.00 108 53.95 4 0 12 1
83
0 361 512.00 109 54.45 0.00 0 0.00 512.00 109 54.45 3 0 12 2
83
Заветные 512, как завещал sfreadahead! И колечество операций tps даже
практически не выросло! Ничего не понимаю! Можно как-то, без
переформатирования всех дисков обратно, заставить nginx читать поумнее? или
дело вообще в чем-то другом?
--
Best regards,
Anton Kuznetsov.
Решил тут заюзать post_action, чтобы после отдачи страницы документа
юзеру дергать наш сервер аналитики (раньше дергал с бекенда, но щас
приделали squid перед ним - не выходит, так как 90% запросов отдаются
из кеша).
Сделал вот так:
location = @analytics_docview {
internal;
proxy_set_header X-Analytics-page_type 'document';
proxy_set_header X-Analytics-docview_uri $docview_uri;
proxy_set_header X-Analytics-referer $http_referer;
proxy_set_header X-Analytics-user_agent $http_user_agent;
proxy_set_header X-Analytics-user_ip $remote_addr;
proxy_connect_timeout 5;
proxy_read_timeout 5;
proxy_send_timeout 5;
access_log logs/analytics-api.log main;
error_log logs/analytics-api.error.log debug;
proxy_pass http://XXXXXXX:4000/collector/register_hit;
}
# Distribute queries among different mongrel packs
# DOCVIEW page - with caching
location /doc/ {
access_log logs/scribd.analytics.log analytics;
add_header X-Served-By backend;
set $docview_uri $uri;
post_action @analytics_docview;
..........................................
... много всего, в основном
... proxy_pass'ы всякие
..........................................
}
Результат оказался странным:
1) В еррор логе:
2008/12/11 02:20:38 [error] 7402#0: *36 could not find named location
"@analytics_docview" while sending to client, client: 66.249.90.136, s
erver: *.scribd.com, request: "GET
/doc/10536/PAN-F49A?query2=WWW.tininfo%40nsdl.co.in HTTP/1.0",
upstream: "http://10.10.170.18:8080/doc/10
536/PAN-F49A?query2=WWW.tininfo%40nsdl.co.in", host: "www.scribd.com"
2) проверял на трафике в 50+ QPS и за 10-15 секунд получил десяток
core-файлов :-/
Core was generated by `nginx: worker process '.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000409e3c in ngx_vsnprintf (buf=0x7fff5291f12c "?*",
max=<value optimized out>, fmt=<value optimized out>,
args=0x7fff5291f030) at src/core/ngx_string.c:426
426 *--p = (u_char) (ui32 % 10 + '0');
(gdb) bt
#0 0x0000000000409e3c in ngx_vsnprintf (buf=0x7fff5291f12c "?*",
max=<value optimized out>, fmt=<value optimized out>,
args=0x7fff5291f030) at src/core/ngx_string.c:426
#1 0x000000000040a219 in ngx_snprintf (buf=0x7fff5291f12c "?*",
max=140734578683891, fmt=0x2ff <Address 0x2ff out of bounds>)
at src/core/ngx_string.c:100
#2 0x0000000000406353 in ngx_log_error_core (level=4, log=0x7d2f00,
err=0, fmt=0x45e090 "could not find named location \"%V\"")
at src/core/ngx_log.c:98
#3 0x000000000042901b in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1934
#4 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
#5 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
#6 0x0000000000429028 in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1937
#7 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
#8 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
#9 0x0000000000429028 in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1937
#10 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
#11 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
#12 0x0000000000429028 in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1937
#13 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
#14 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
#15 0x0000000000429028 in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1937
#16 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
#17 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
#18 0x0000000000429028 in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1937
#19 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
.............
............тут очень много одинаковых блоков вызовов (злобная такая рекурсия)
............
#39500 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
#39501 0x0000000000429028 in ngx_http_named_location (r=0x700640,
name=0x671d40) at src/http/ngx_http_core_module.c:1937
#39502 0x000000000042b560 in ngx_http_post_action (r=0x700640) at
src/http/ngx_http_request.c:2560
#39503 0x000000000042cd35 in ngx_http_finalize_request (r=0x700640,
rc=500) at src/http/ngx_http_request.c:1706
---Type <return> to continue, or q <return> to quit---
Дальше мне надоело жать ентер :-)
Внимание, вопрос: что делать? :-(
--
Alexey Kovyrin
http://kovyrin.info/
Hello,
nginx-0.5.35.
Пользую FCGI::ProcManager. Обнаружил, что CGI.pm работает неправильно, привязал CGI::Fast.
Переменные из GET берёт хорошо, а из POST --- нет.
Порылся в исходниках FCGI, и понял, что POST обрабатывается в CGI.pm.
Собственно проблема с nginx в том, что я ему пишу в конфиге
===
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
===
а переменные в FCGI::ProcManager попадают в %ENV:
===
HTTP_CONTENT_TYPE
HTTP_CONTENT_LENGTH
===
остальные прописанные в конфиге --- идут как есть. И действительно, вот я вставляю в мой FCGI::Spawn:
===
map { $ENV{ $_ } = $ENV{ "HTTP_$_" } } qw/CONTENT_LENGTH CONTENT_TYPE/
if $ENV{ 'REQUEST_METHOD' } eq 'POST';
===
перед "new CGI::Fast" --- и переменные им берутся как надо.
Вопрос в чём: я всё оставляю как сейчас, или это бага nginx? а то мы спецификаций да сишных исходников не читатели, только почитатели-причитатели :)
73! Peter
--
http://vereshagin.org
Пришлось переделать mod-access-key так чтоб он запрашивал доступ на URL в
базу.
Вот код
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = "localhost";
char *user = "root";
char *password = "123";
char *database = "download";
unsigned int retint;
conn = mysql_init(NULL);
if (!mysql_real_connect(conn, server, user, password, database, 0, NULL,
0)) {
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, "Error:
%s\n",mysql_error(conn));
};
signed char *q_uri = (signed char *)r->unparsed_uri.data;
sprintf(query, "SELECT COUNT(*) AS CNT FROM DOWNS WHERE URI =
RTRIM('%s')", q_uri);
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, "EXECUTING: %s",query);
if (mysql_query(conn, query)) {
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, "Error:
%s",mysql_error(conn));
};
res = mysql_use_result(conn);
row = mysql_fetch_row(res);
*Проблема:*
никак не удается взать резултат из базы в переменную.
*retint = (unsigned int)row[0];*
mysql_free_result(res);
mysql_close(conn);
чтоб потом сделать простои IF.
if (retint > 0)
{
return NGX_OK;
}
else
{
return NGX_HTTP_FORBIDDEN;
};
Все ето происходит на линуксе, пробовал и етот код работает на тестере (не
модуль, просто апликация пишет на stdout)
За любую помощь буду очень благодарен,
С уважением,
Hi, all!
Есть проблемы с использованием weight в upstream в целях распределения
нагрузки.
Если вес выставлен одинаковый, то нагрузка распределяется равномерно.
Пример:
upstream test_backend {
server localhost:59040 weight=10000;
server other_server:59040 weight=10000;
}
Если же выставить разный вес, то нагрузка распределяется неравномерно по
времени, каждые десять минут меняется сервер и все. Сужу об этом по графикам
загрузки серверов. 10 минут все запросы идут на один сервер, затем 10 мин. на
другой.
Пример:
upstream test_backend {
server localhost:59040 weight=10000;
server other_server:59040 weight=5000;
}
location / {
expires epoch;
fastcgi_pass test_backend;
fastcgi_upstream_max_fails 0;
fastcgi_next_upstream error timeout invalid_header http_500;
include fastcgi_param.conf;
}
Но обнаружил, что если цель треть нагрузки отправлять на другой сервер, то
такое помогает:
upstream test_backend {
server localhost:59040 weight=10000;
server localhost:59040 weight=10000;
server other_server:59040 weight=10000;
}
# nginx -v
nginx version: nginx/0.3.60
# uname -a
Linux tapo.net 2.6.8-2-386 #1 Tue Aug 16 12:46:35 UTC 2005 i686 GNU/Linux
Я понимаю, что для _быстрого_ web сервера CGI не приемлем, но увы приходится изобретать велосипед в виде fastcgi -> cgi конвертера или nginx proxy -> mini_httpd. Хотелось бы не заморачиваться с этими подходами, а настроить нативную поддержку CGI в nginx. Будет ли это реализовано в ветке 0.7.x?
P.S. Будет ли реализована поддержка scgi?
--
К примеру, есть есть PHP скрипт такого содержания:
<?php
for ($i = 0; $i < 30; $i++)
{
echo 'xxxxxxxxxxxxxxxx<br>';
ob_flush();
flush();
sleep(1);
};
?>
Он досылает на клиент новые данные в течении 30 сек с интервалом в 1 сек.
Когда PHP работает как mod_apache, то именно так и происходит. Но в связке
nginx+FastCGI (менеджером FastCGI служит php-fpm) получается так: 30
секунд ни какого ответа, а потом бааах и уже готова страница.
Вот не знаю в какую сторону копать.
Hello all,
После апргрейда до 0.7.24 обнаружилось следующее:
Если
server_name .abcd.net;
то случается segfault:
0x000000000043683d in ngx_http_find_virtual_server (r=0x640010,
host=0x6405c9 "www11.abcd.net", len=14) at src/http/ngx_http_request.c:1653
1653 r->srv_conf = cscf->ctx->srv_conf;
Если заменить на
server_name abcd.net *.abcd.net;
То тогда все нормально.
Проблема только на одном домене. На других более длинных доменах все
нормально.