1
Kvm 2013-02-02 02:39:31 +08:00
楼主直接把cache写到/dev/shm么
|
2
Tianpu OP @Kvm
现在是分配了五个proxy_cache_path 然后每个分配1.25G内存 允许32G的缓存文件 缓存文件放在一块sansung 830的硬盘上 运行了15个小时了 缓存文件有300来万 改成缓存2天了 页面变化都不大 有修改的话API会自动刷新 再长时间inode好像不大够 这个得后续看 大体上还算稳定 worker_cpu_affinity 导致后端出现严重的问题 去掉了 增大进程了 配置大约是这个样子 压缩什么的都放后端了 前端就是负责输出: ############################################### user www www; worker_processes 32; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { client_header_buffer_size 4k; client_body_buffer_size 128k; large_client_header_buffers 4 4k; server_names_hash_max_size 1280; server_names_hash_bucket_size 128; client_max_body_size 4m; server_name_in_redirect off; sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; keepalive_timeout 60; open_file_cache max=65535 inactive=300s; open_file_cache_valid 500s; open_file_cache_errors on; proxy_cache_path /www/zonea levels=1:2 keys_zone=zonea:1280m inactive=3d max_size=32g; proxy_cache_path /www/zoneb levels=1:2 keys_zone=zoneb:1280m inactive=3d max_size=32g; proxy_cache_path /www/zonec levels=1:2 keys_zone=zonec:1280m inactive=3d max_size=32g; proxy_cache_path /www/zoned levels=1:2 keys_zone=zoned:1280m inactive=3d max_size=32g; proxy_cache_path /www/zonee levels=1:2 keys_zone=zonee:1280m inactive=3d max_size=32g; server { listen 8.8.8.8:80; server_name www.v2ex.com v2ex.com; location / { proxy_pass http://4.4.4.4:80; proxy_cache zonea; proxy_cache_key $request_method://$host$request_uri; proxy_buffer_size 8k; proxy_buffers 4 32k; proxy_busy_buffers_size 96k; proxy_temp_file_write_size 256k; proxy_cache_valid 200 301 302 1d; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout updating invalid_header http_500 http_502 http_504 http_404; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header HTTP_CLIENT_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header X-Cached $upstream_cache_status; } location ~ /purge(/.*) { proxy_cache_purge zonea $request_method://$host$1; } access_log off; } .... } ############################################### 现在有一个问题 在同一个局域网的前端和后端的机器互相ping是0.86ms 实际抓取网页测试 有时候会卡到1.2s 应该是后端对并发支持不佳吧 也可能是流氓msnbot造成的 整体上还在观察 下一步重点测试keepalive相关的参数 |
3
chairo 2013-02-03 01:06:10 +08:00 1
楼主说的1.25G内存,据说,貌似,可能,估计只是存储文件的名字,其实不存储文件内容的。楼主要多少文件名字才能占满1.25G内存……
|
4
Tianpu OP @chairo 天啊 这是必然的 我估计2天的缓存时间可以有1000来万个文件 512M应该足够了
proxy_pass部分使用upstream使用公网IP做了个backup,然后keepalive了下 速度有所提升 继续看别的 |
6
Kvm 2013-02-04 02:12:20 +08:00 1
设一个keys_zone吧
挂载存到shm里面去 |
7
ownway 2013-02-04 12:54:56 +08:00
varnish,全放内存
|
8
BOYPT 2013-02-04 14:15:43 +08:00 1
varnish做这些比nginx擅长多了。
|
9
Tianpu OP 感谢诸位的建议 varnish我担心的就是全放到内存
>站点类型以搜索结果 还有缓存的缩略图 fastcgi生的网页比较多 >过去15个小时一共产生了230万个临时文件 使用了35G硬盘 >按照2天估计 会有1024万个文件 112G硬盘 >硬盘一共有256G 1300万个inodes >如果放到内存一部分 会不会反而反复的交换内存和硬盘? |
10
Tianpu OP @Kvm keys_zone 考虑文件数会达到1000万左右 一个key占用128字节 一共需要1250M 那单个进程处理一个大内存块(1250M)会比多个小内存块(5*250)更好吗?
现在留下大量内存 是想让系统自动管理内存和硬盘间的缓存 具体就是top的cached指标 不知道是不是想的差的太远? |
11
Tianpu OP 配置稍微有点更新,我贴出来:
user www www; worker_processes 16; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { include mime.types; default_type application/octet-stream; client_header_buffer_size 4k; client_body_buffer_size 128k; large_client_header_buffers 4 4k; server_names_hash_max_size 1280; server_names_hash_bucket_size 128; client_max_body_size 4m; server_name_in_redirect off; sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; keepalive_timeout 60; open_file_cache max=65536 inactive=20s; open_file_cache_valid 30s; open_file_cache_errors on; gzip on; gzip_min_length 128; gzip_buffers 32 4k; gzip_http_version 1.0; gzip_comp_level 3; gzip_types text/plain text/css application/x-javascript application/xml; gzip_vary on; proxy_cache_path /www/zonea levels=1:2 keys_zone=zonea:256m inactive=3d max_size=32g; proxy_cache_path /www/zoneb levels=1:2 keys_zone=zoneb:256m inactive=3d max_size=32g; proxy_cache_path /www/zonec levels=1:2 keys_zone=zonec:256m inactive=3d max_size=32g; proxy_cache_path /www/zoned levels=1:2 keys_zone=zoned:256m inactive=3d max_size=32g; proxy_cache_path /www/zonee levels=1:2 keys_zone=zonee:256m inactive=3d max_size=32g; upstream backend { server 10.4.1.1:80; server 8.8.8.8:80 backup; keepalive 32; } server { listen 80; server_name www.v2ex.com v2ex.com; location / { proxy_pass http://backend; proxy_cache zonea; proxy_cache_key $scheme://$host$request_uri; proxy_http_version 1.1; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 96k; proxy_temp_file_write_size 256k; proxy_cache_valid 200 301 302 2d; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout updating invalid_header http_500 http_502 http_504 http_404; proxy_set_header Connection ''; proxy_set_header Host $host; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~ /purge(/.*) { proxy_cache_purge zonea $scheme://$host$1; } access_log off; } } 主要是三点: 1、观察$request_method对于缓存结果没有影响,合并了HEAD和GET的缓存 2、后端不再负责gzip,交给前端来做 3、proxy_pass增加公网IP作为备份,仍旧以内网IP为主,同时设置32个持久连接 |
12
LazyZhu 2013-02-05 10:38:27 +08:00 1
1.虽然你设置了zone[a-e],但是实际你只用了zonea;
2.要实现冷热缓存的话: a.简单的,可以设置多个proxy_cache和多个location进行匹配,但必须人工区别那些资源是冷或热 b.复杂点,可以自己写个访问计数器(ngx_lua),实现类似“1分钟内访问超过10次的资源存为内存缓 存1天,3分钟内访问超过1次的资源存为磁盘缓存12小时,..." |