При скачивание файла увеличивается потребление память

12
O2
На сайте с 10.10.2011
Offline
36
1245

Здравствуйте.

Установлена связка Apache(backend) + nginx (frontend) на Debian 7 x64. При загрузки файлов разных размеров (есть как 1Mb так и 500+Mb) почти вся память уходит в кеш, чуть больше загружаемого размера файла. Если делаю рестарт nginx то часть памяти освобождается, а часть остается забитой по понятной причине. На сервере 2Г памяти, при загрузки ~5-10 файлов остается 65-80Mb памяти, из за этого не могу увеличить некоторые лимиты в conf-игах, так как начинается использование swapa. Искал решение, наткнулся на такую же ситуацию - тык

Парень решил проблему так:

Проблему решил. Добавил в конфиг виртуального сервера в раздел server {} две директивы:
directio 512;
output_buffers 1 256k;

Теперь при скачивании файла размером в 1.7 ГБ выделяется 5 мб оперативной памяти

Я тоже установил эти директивы, но потребление памяти не изменилось, в чем может быть проблема? Как думаете?

И вообще, как лучше отдавать большие файлы, через nginx или apache2? Что будет менее требовательным по ресурсам?

[Удален]
#1

Только nginx!

Покажите весь конфиг.

Andreyka
На сайте с 19.02.2005
Offline
822
#2
oo22rus:

Я тоже установил эти директивы, но потребление памяти не изменилось, в чем может быть проблема? Как думаете?

Забыл рестартануть nginx после изменения конфига?

Не стоит плодить сущности без необходимости
O2
На сайте с 10.10.2011
Offline
36
#3
Andreyka:
Забыл рестартануть nginx после изменения конфига?

Нет, не забыл, с этим у меня проблем нет=)

Вот кфг:

nginx.conf


# Server globals
user www-data;
worker_processes 1;
worker_priority -5;
error_log /var/log/nginx/error.log error;
pid /var/run/nginx.pid;


# Worker config
events {
worker_connections 2048;
use epoll;
}


http {
# Main settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_buffer_size 1k;
client_body_buffer_size 2k;
client_max_body_size 500m;
large_client_header_buffers 4 8k;
send_timeout 10;
keepalive_timeout 20 20;
reset_timedout_connection on;
server_tokens off;
server_name_in_redirect off;
server_names_hash_max_size 512;
server_names_hash_bucket_size 512;

open_file_cache max=20000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors off;


# Log format
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format bytes '$body_bytes_sent';
#access_log /var/log/nginx/access.log main;
access_log off;


# Mime settings
include /etc/nginx/mime.types;
default_type application/octet-stream;


# Compression
gzip on;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 64 8k;
gzip_types text/plain text/css application/json
application/x-javascript text/xml application/xml
application/xml+rss text/javascript application/javascript;
gzip_proxied any;


# Proxy settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;


# SSL PCI Compliance
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE...";


# Error pages
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 502 503 504 /error/50x.html;


# Cache
proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=128m;
proxy_cache_key "$host$request_uri $cookie_user";
proxy_temp_path /var/cache/nginx/temp;
proxy_ignore_headers Expires Cache-Control;
proxy_cache_use_stale error timeout invalid_header http_502;
proxy_cache_valid any 3d;

map $http_cookie $no_cache {
default 0;
~SESS 1;
~wordpress_logged_in 1;
}


# Wildcard include
include /etc/nginx/conf.d/*.conf;
}

Конфиг виртуального сервера


server {
listen ip:80;
server_name сайт.ru www.сайт.ru;
error_log /var/log/apache2/domains/сайт.ru.error.log error;

location / {
proxy_pass http://ip:8080;
location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|htm|html|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|tar|tgz|gz|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mp4|mpeg|mpg|wmv|dmg|zip|rar|swf|msi|exe)$ {
# проверяю
directio 512k;
output_buffers 1 256k;

root /home/user/web/сайт.ru/public_html;
access_log /var/log/apache2/domains/сайт.log combined;
access_log /var/log/apache2/domains/сайт.ru.bytes bytes;
expires max;
try_files $uri @fallback;
}
}

location /error/ {
alias /home/user/web/сайт.ru/document_errors/;
}

location @fallback {
proxy_pass http://ip:8080;
}

location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}

include /home/user/conf/web/nginx.сайт.ru.conf*;
}
VK
На сайте с 29.12.2011
Offline
42
#4

oo22rus, вынесите location со статикой за пределы location /

O2
На сайте с 10.10.2011
Offline
36
#5
V2NEK:
oo22rus, вынесите location со статикой за пределы location /

Сделал так:


location / {
proxy_pass http://ip:8080;
}
location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|htm|html|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|tar|tgz|gz|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mp4|mpeg|mpg|wmv|dmg|zip|rar|swf|msi|exe)$ {
# проверяю
directio 512k;
output_buffers 1 256k;

root /home/user/web/сайт.ru/public_html;
access_log /var/log/apache2/domains/сайт.log combined;
access_log /var/log/apache2/domains/сайт.ru.bytes bytes;
expires max;
try_files $uri @fallback;
}

Но не помогло, память уходит, вот пример:


total used free shared buffers cached
Mem: 2061288 1519664 541624 0 10600 1344288
-/+ buffers/cache: 164776 1896512
Swap: 522236 0 522236
роот:~$ free
total used free shared buffers cached
Mem: 2061288 1667984 393304 0 10608 1489052
-/+ buffers/cache: 168324 1892964
Swap: 522236 0 522236
роот:~$ free
total used free shared buffers cached
Mem: 2061288 1766448 294840 0 10620 1583484
-/+ buffers/cache: 172344 1888944
Swap: 522236 0 522236
роот:~$ free
total used free shared buffers cached
Mem: 2061288 1517160 544128 0 10688 1340244
-/+ buffers/cache: 166228 1895060
Swap: 522236 0 522236
Оптимизайка
На сайте с 11.03.2012
Offline
396
#6

А почему вы считаете, что память "уходит"? Все нормально же вроде. Используется меньше 200K, свободной памяти куча. Вас значение "cached" смущает? Ну так это нормально, Linux всю свободную память старается отдать под дисковый кэш, при необходимости он её оттуда изымает.

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
O2
На сайте с 10.10.2011
Offline
36
#7
Оптимизайка:
А почему вы считаете, что память "уходит"? Все нормально же вроде. Используется меньше 200K, свободной памяти куча. Вас значение "cached" смущает? Ну так это нормально, Linux всю свободную память старается отдать под дисковый кэш, при необходимости он её оттуда изымает.

Вот я тоже так думал, что все вроде норм, занято не много памяти, но как начинаю увеличивать параметры в конфигах начинается использование свапа, а это ведь не есть гуд. А текущие настройки не подходят для нагруженного сайта, серв виснет и перезагружается. Если я правильно понял, nginx перед тем как отдать файл пользователю, отправляет его с начало в память (кеш), а потом отдает уже. Я же хочу, что бы при отдачи 1 файла выделялась, допустим, 5Mb памяти под это дело, а не размер файла + ~30%.

Я выше уже цитировал и давал ссылку на похожую ситуацию, но вот процитирую полность последний пост:

Проблему решил. Добавил в конфиг виртуального сервера в раздел server {} две директивы:
directio 512;
output_buffers 1 256k;
Теперь при скачивании файла размером в 1.7 ГБ выделяется 5 мб оперативной памяти
Наверно, нужно ещё подобрать определённые значения для достижения минимальных затрат, хотя лично меня и такие устраивают =)

Вот я тоже так хочу сделать... Но ток у меня почему то эти директивы не работают.

---------- Добавлено 28.01.2015 в 22:28 ----------

И еще, меня кеш не смущает, а вот свап очень =)

Оптимизайка
На сайте с 11.03.2012
Offline
396
#8

Ни разу не видел, чтобы nginx уходил в своп при отдаче статического файла. Вы уверены, что дело в нем? Или файл не статический?

Какая у вас нагрузка - сколько запросов в секунду, приблизительно?

O2
На сайте с 10.10.2011
Offline
36
#9
Оптимизайка:
Ни разу не видел, чтобы nginx уходил в своп при отдаче статического файла. Вы уверены, что дело в нем? Или файл не статический?
Какая у вас нагрузка - сколько запросов в секунду, приблизительно?

Сразу скажу, у меня опыта еще не особо много в настройке сервера, чуть больше недели... Но, по мне так в нем. Ну где-то 7к трафик, онлайн бывает 40 человек. Большая часть памяти уходит под дисковый кеш и пока эти 40 человек качаю она не освобождается, ведь так? Я думаю так, а какой нибудь mysql или чему-то еще, нужна память и тут начинается использование свапа.

P
На сайте с 16.03.2009
Offline
144
#10

http://www.linuxatemyram.ru/

не хотите, чтобы свопалась - используйте vm.swappiness=0

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий