参考资料
http://yaocoder.blog.51cto.com/2668309/1312821
-
C10K问题http://www.kegel.com/c10k.html(必须要读呀)
- I/O frameworks
- I/O strategies
- limits on open filehandles
- limits on threads
-
tips
- zero-copy
- sendfile
- avoid small frames by using writev
- some programs can benefit from using non-posix threads
- cache
-
- /etc/security/limits.conf
-
全局限制
- /proc/sys/fs/file-nr
- /etc/sysctl.conf
-
服务器端和端口数限制65535无关
- 端口号并不是并发量的限制
- server最大tcp连接数
http://nginx.com/blog/http-keepalives-and-web-performance/
许多服务器都有并发链接数限制,比如,通常配置中,Apacher server能够处理150(workder)或者256(prework)条并发连接。而每一个HTTP keepalive连接(极可能是空闲的)占用一个并发槽,一旦所有的并发槽被占用,服务器将不再接受新的HTTP连接。
通常的解决方法是关闭keepalive或者限制到一个特别短的时间。
另外,许多服务器为每一个HTTP请求创建一个进程/线程,例如Appache。TCP连接所以非常轻量级的,而进程/线程要重的多,造成了资源的浪费:消耗内存、增加上下文切换开销,这种现象被称为"HTTP Heavy Lifting"。这种并发模型固有的限制了并发连接数。
测试中没有发现这种问题?
- 客户端过少?
- 没有使用keepalive?
如何解决这种问题
- 增加进程/线程数
- 禁止或者限制keepalive
- 特殊的keepalive处理方式,比如Apache的Event multi-processing module
-
使用更有效的处理模型
- 最简单和有效的方式就是增加一个高效的HTTP proxy,比如Nginx
- 在web server/application server使用异步处理
Nginx的请求处理模型
使用Nginx作为Http Proxy,极大程度减少了web server/application server的连接负担
使用Nginx作为Proxy的好处
- 高效的资源利用率,web/application server没有了http连接的负担,能够处理更多的事务
- 降低Http timeout的概率
- 改善用户体验:http timeout、请求处理速度