여유 RAM이 많지만 IO는 항상 100% 활용률이거나 매우 가깝습니다. 더 많은 RAM을 사용하여 IO를 줄일 수 있는 방법은 무엇입니까? 내 iotop은 io 비율이 가장 높은 nginx 작업자 프로세스를 보여줍니다. 이것은 1MB에서 2GB 범위의 파일을 제공하는 파일 서버입니다. 여기 내 nginx.conf가 있습니다.
#user nobody;
worker_processes 32;
worker_rlimit_nofile 10240;
worker_rlimit_sigpending 32768;
error_log logs/error.log crit;
#pid logs/nginx.pid;
events {
worker_connections 51200;
}
http {
include mime.types;
default_type application/octet-stream;
access_log off;
limit_conn_log_level info;
log_format xfs '$arg_id|$arg_usr|$remote_addr|$body_bytes_sent|$status';
sendfile off;
tcp_nopush off;
tcp_nodelay on;
directio 4m;
output_buffers 3 512k;
reset_timedout_connection on;
open_file_cache max=5000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
client_body_buffer_size 32k;
server_tokens off;
autoindex off;
keepalive_timeout 0;
#keepalive_timeout 65;
답변1
Sendfile을 켜십시오. output_buffers를 기본값으로 둡니다. 방향을 끕니다. RAM을 더 추가하세요.
Linux VFS 캐시보다 더 좋은 것은 없습니다.
답변2
이 답변은 단지 하나의 관찰일 뿐이므로 받아들이지 마십시오. 그러나 4M이 넘는 파일에는 직접 IO를 사용하고 파일에 대해 nginx 1.5MB의 메모리 버퍼만 허용합니다.
directio 4m;
output_buffers 3 512k;
내가 올바르게 기억한다면 직접 IO는 기본적으로 파일 시스템 IO 캐시를 우회하여 HDD에서 직접 읽습니다. 따라서 4M가 넘는 파일의 경우 파일을 버퍼링하는 데 메모리를 사용하지 않고 4M 미만의 파일의 경우 1.5M 메모리만 사용합니다.
답변3
일부 요청을 메모리에서 직접 처리하려는 것 같습니다. 이는 본질적으로 해당 요청을 캐싱하는 것과 같습니다. 기본 형식에서는 요청을 처리하고, 메모리 기반 캐시에 복사본을 저장하고, 메모리에서 동일한 리소스에 대한 후속 요청을 처리합니다(캐시된 복사본을 무효화/만료할 때까지).
이 구현은 사이트의 특성에 따라 달라집니다(예: 매우 큰 파일을 제공하는 경우 실용적이지 않습니다. 콘텐츠가 매우 동적인 경우 많은 이점을 제공하지 않습니다. 등). '평균' 사이트의 경우 - 대부분의 페이지 I/O가 정적 리소스(특히 이미지)에서 나오므로 디스크 I/O가 줄어들고 속도도 빨라집니다.
백엔드 서버로 프록싱하는 경우 nginx의 Proxy_cache 지시문을 사용하여 페이지를 캐시할 수 있습니다. 그러나 캐시 위치는 일반적으로 디스크에 있습니다(속도가 빨라질 수 있지만 디스크 I/O에 저장되지 않을 수 있음). 캐시를 저장할 메모리(예: 램디스크)에 매핑된 tmpfs를 생성하여 이 문제를 해결할 수 있습니다. . 마찬가지로 FastCGI를 사용하는 경우 fastcgi_cache를 사용할 수 있습니다.
또 다른 유사한 옵션(예: nginx를 프록시로 사용하지 않고 FastCGI를 사용하지 않는 경우)은 페이지를 MemCached에 저장하는 것입니다. Nginx에는 memcached 모듈이 포함되어 있어 자신만의 캐싱 메커니즘을 설정할 수 있습니다.
또는 Nginx(예: Varnish) 앞에 캐싱 프록시를 추가하면 요청을 수신하고 직접 제공하거나 Nginx에 요청을 전달할 수 있습니다. Varnish는 캐시를 메모리(또는 파일 - I/O에는 도움이 되지 않지만)에 저장하도록 구성할 수 있으며 최소한의 디스크 I/O로 캐시 히트를 제공합니다.
답변4
worker_processes 32;
— 아직도 왜인지 짐작하고 있나요?
여유 RAM이 많지만
sendfile off;
또한 보유 및 사용 에 대한 추론을 듣고 싶습니다 directio
. directio(정의에 따라)가 FS 캐싱을 금지한다는 것을 아는 유일한 사람입니까(확실히 그렇지는 않습니다1)?
__ 1 — Martin F는 적어도 이것을 기억하고 있습니다.nginx로 인한 IO 감소