Cần tăng thông lượng nginx lên một ổ cắm unix ngược dòng - điều chỉnh kernel linux?


28

Tôi đang chạy một máy chủ nginx hoạt động như một proxy cho một ổ cắm unix ngược dòng, như thế này:

upstream app_server {
        server unix:/tmp/app.sock fail_timeout=0;
}

server {
        listen ###.###.###.###;
        server_name whatever.server;
        root /web/root;

        try_files $uri @app;
        location @app {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://app_server;
        }
}

Đổi lại, một số quy trình máy chủ ứng dụng sẽ loại bỏ các yêu cầu /tmp/app.sockkhi chúng có sẵn. Máy chủ ứng dụng cụ thể được sử dụng ở đây là Unicorn, nhưng tôi không nghĩ điều đó có liên quan đến câu hỏi này.

Vấn đề là, dường như chỉ qua một lượng tải nhất định, nginx không thể nhận được yêu cầu qua ổ cắm với tốc độ đủ nhanh. Không quan trọng tôi thiết lập bao nhiêu quy trình máy chủ ứng dụng.

Tôi đang nhận được một loạt các thông báo này trong nhật ký lỗi nginx:

connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream

Nhiều yêu cầu dẫn đến mã trạng thái 502 và những yêu cầu không mất nhiều thời gian để hoàn thành. Các nginx viết hàng đợi stat dao động khoảng 1000.

Dù sao, tôi cảm thấy như mình đang thiếu một cái gì đó rõ ràng ở đây, bởi vì cấu hình đặc biệt này của nginx và máy chủ ứng dụng là khá phổ biến, đặc biệt là với Unicorn (thực tế đây là phương pháp được đề xuất). Có bất kỳ tùy chọn kernel linux nào cần được thiết lập, hoặc một cái gì đó trong nginx không? Bất kỳ ý tưởng về làm thế nào để tăng thông lượng cho ổ cắm ngược dòng? Một cái gì đó rõ ràng là tôi đang làm sai?

Thông tin bổ sung về môi trường:

$ uname -a
Linux servername 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

$ unicorn -v
unicorn v4.3.1

$ nginx -V
nginx version: nginx/1.2.1
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled

Các chỉnh sửa kernel hiện tại:

net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
net.netfilter.nf_conntrack_max = 524288

Cài đặt Ulimit cho người dùng nginx:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Bạn đã kiểm tra đầu ra ulimit, cụ thể số lượng tệp đang mở chưa?
Khaled

@Khaled, ulimit -nnói 65535.
Ben Lee

Câu trả lời:


16

Nghe có vẻ như nút cổ chai là ứng dụng cung cấp năng lượng cho ổ cắm chứ không phải là chính Nginx. Chúng tôi thấy điều này rất nhiều với PHP khi được sử dụng với các socket so với kết nối TCP / IP. Trong trường hợp của chúng tôi, PHP tắc nghẽn sớm hơn nhiều so với Nginx từng có.

Bạn đã kiểm tra giới hạn theo dõi kết nối sysctl.conf, giới hạn tồn đọng của socket

  • net.core.somaxconn
  • net.core.netdev_max_backlog

2
Tôi đã tìm ra vấn đề. Xem câu trả lời tôi đã đăng. Nó thực sự nút cổ chai ứng dụng, không phải ổ cắm, giống như bạn đặt ra. Tôi đã loại trừ điều này sớm hơn do chẩn đoán sai, nhưng hóa ra vấn đề là thông qua máy chủ khác. Chỉ ra điều này một vài giờ trước. Tôi sẽ trao thưởng cho bạn tiền thưởng, vì bạn đã đóng góp rất nhiều nguồn gốc của vấn đề ngay cả khi chẩn đoán sai tôi đặt trong câu hỏi; tuy nhiên, sẽ đưa ra dấu kiểm cho câu trả lời của tôi, vì câu trả lời của tôi mô tả các trường hợp chính xác để có thể giúp ai đó trong tương lai với một vấn đề tương tự.
Ben Lee

Có một máy chủ mới được chuyển đến một vị trí để cung cấp thông lượng đầy đủ, xây dựng lại hoàn toàn hệ thống và vẫn có cùng một vấn đề. Vì vậy, hóa ra vấn đề của tôi vẫn chưa được giải quyết ... = (Tôi vẫn nghĩ đó là ứng dụng cụ thể, nhưng không nghĩ được gì. Máy chủ mới này được thiết lập giống hệt như một máy chủ khác, nơi nó hoạt động tốt. Vâng, somaxconn và netdev_max_backlog đang lên chính xác.
Ben Lee

Vấn đề của bạn không phải là nginx, nó còn hơn cả khả năng - nhưng điều đó không có nghĩa là bạn có thể không có một thiết lập giả mạo. Ổ cắm đặc biệt nhạy cảm dưới tải cao khi các giới hạn không được cấu hình đúng. Bạn có thể thử ứng dụng của bạn với tcp / ip không?
Ben Lessani - Sonassi

cùng một vấn đề với cường độ thậm chí còn tệ hơn khi sử dụng tcp / ip (ghi hàng đợi leo lên nhanh hơn nữa). Tôi có nginx / unicorn / kernel tất cả được thiết lập giống hệt nhau (theo như tôi có thể nói) trên một máy khác và máy kia không biểu hiện vấn đề này. (Tôi có thể chuyển dns giữa hai máy, để kiểm tra tải trực tiếp và có dns trên ttl 60 giây)
Ben Lee

Thông lượng giữa mỗi máy và máy db là như nhau và độ trễ giữa máy mới và máy db lớn hơn khoảng 30% so với giữa máy cũ và db. Nhưng thêm 30% rằng một phần mười của một phần nghìn giây không phải là vấn đề.
Ben Lee

2

Bạn có thể thử nhìn vào unix_dgram_qlen, xem tài liệu Proc . Mặc dù điều này có thể kết hợp vấn đề bằng cách chỉ ra nhiều hơn trong hàng đợi? Bạn sẽ phải xem (netstat -x ...)


Bất kỳ tiến bộ với điều này?
JMW

1
Cảm ơn ý tưởng, nhưng điều này dường như không tạo ra sự khác biệt.
Ben Lee

0

Tôi đã giải quyết bằng cách tăng số lượng tồn đọng trong cấu hình / unicorn.rb ... Tôi đã từng tồn đọng 64.

 listen "/path/tmp/sockets/manager_rails.sock", backlog: 64

và tôi đã nhận được lỗi này:

 2014/11/11 15:24:09 [error] 12113#0: *400 connect() to unix:/path/tmp/sockets/manager_rails.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 192.168.101.39, server: , request: "GET /welcome HTTP/1.0", upstream: "http://unix:/path/tmp/sockets/manager_rails.sock:/welcome", host: "192.168.101.93:3000"

Bây giờ, tôi đã tăng lên 1024 và tôi không gặp lỗi:

 listen "/path/tmp/sockets/manager_rails.sock", backlog: 1024

0

tl; dr

  1. Đảm bảo tồn đọng Unicorn lớn (sử dụng ổ cắm, nhanh hơn TCP) listen("/var/www/unicorn.sock", backlog: 1024)
  2. Tối ưu hóa cài đặt hiệu suất NGINX , ví dụ:worker_connections 10000;

Thảo luận

Chúng tôi có cùng một vấn đề - một ứng dụng Rails được Unicorn phục vụ đằng sau proxy ngược NGINX.

Chúng tôi đã nhận được các dòng như thế này trong nhật ký lỗi Nginx:

2019/01/29 15:54:37 [error] 3999#3999: *846 connect() to unix:/../unicorn.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: xx.xx.xx.xx, request: "GET / HTTP/1.1"

Đọc các câu trả lời khác, chúng tôi cũng nhận ra rằng có lẽ Unicorn sẽ đổ lỗi, vì vậy chúng tôi đã tăng số lượng tồn đọng, nhưng điều này không giải quyết được vấn đề. Theo dõi các quy trình máy chủ, rõ ràng là Unicorn không nhận được yêu cầu để làm việc, vì vậy NGINX dường như là nút cổ chai.

Đang tìm kiếm các thiết lập nginx để tinh chỉnh trong nginx.confnày bài viết chỉnh hiệu suất đã chỉ ra một số thiết lập có thể tác động bao nhiêu thì yêu cầu song song Nginx có thể xử lý, đặc biệt là:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 400000; # important

events {    
  worker_connections 10000; # important
  use epoll; # important
  multi_accept on; # important
}

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  keepalive_requests 100000; # important
  server_names_hash_bucket_size 256;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.