前言 在项目功能完成后,项目部署到服务器是非常重要的一环。 而在部署过程中将各个参数调整对于性能的提升是非常明显的。这样既可以节约硬件成本,又可以将相应时间缩短,又可以提高服务器的稳定性,可谓是一举三得。
服务器的优化是非常复杂的过程,主要是几个方面,服务器的安全提升、服务器的性能调优等等。 单说性能优化,这关乎到语言的选择,框架的选择,服务器(linux/freebsd)等等的选择,而我们学习的是java语言,我们知道,单点tomcat在不使用nginx的情况下,能承载的最多也就是200-300的并发量,而加上了nginx之后,能大幅度提升服务器的并发承载量,不仅仅是因为nginx可以做负载均衡(load-banlance),更重要的是nginx可以让请求进行排队,而不是将压力赋予给tomcat,这样tomcat可以更加专注地完成业务操作,从而提高性能。
今天我们就来讲讲服务器最基本的参数调整提高服务器的性能– tomcat+nginx
服务器的选择首先,我们来分析一下服务器的选择,看一看大公司是使用什么系统来进行部署, 好的操作系统能提高好的性能、稳定性和安全性,而这些对大型网站的性能、安全性和稳定性都是至关重要的。 淘宝网(阿里巴巴): Linux操作系统 + Web 服务器:Apache
新浪:FreeBSD + Web 服务器:Apache
Yahoo:FreeBSD + Web 服务器:自己的
Google: 部分Linux + Web 服务器:自己的
百度:Linux + Web 服务器: Apache
网易:Linux + Web 服务器: Apache
eBay: Windows Server 2003/8 (大量) + Web 服务器:Microsoft IIS
MySpace: Windows Server 2003/8 + Web 服务器:Microsoft IIS
由此可见,开源操作系统做Web应用是首选已经是一个既定事实。在开源操作系统中Linux和FreeBSD差不太多,很难说哪个一定比另外一个要优秀很多、能够全面的超越对手,应该是各有所长。但熟悉Linux的技术人员更多些,利于系统管理、优化等,所以Linux使用更广泛。而Windows Server和IIS虽然有的网站使用,但不开源,而且需要购买微软的一系列应用产品,限制了其使用。总之,开源操作系统,尤其是Linux做Web应用是首选已经是一个既定事实。 虽然对linux服务器的优化也特别重要,今天我们不重要讲系统的优化,主要讲部署软件参数的优化
Nginx优化进程数的优化
一般nginx中,进程数一般设置为服务器cpu核数的倍数,例如:CPU为双核,则设置进程数目为4或者8,每个nginx进程消耗的内存10兆的模样 worker_processes 8; 将进程分配给制定CPU 假如是8核 cpu 分配如下:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000
00100000 01000000 10000000 Nginx最大打开文件数 当使用linux时,最大文件打开数是有限制的。在linux中可使用ulimit –n来查看最大文件打开数,一般设置值为系统最大文件打开数除以最大进程数,但是大多数都是除不尽,导致资源分配不均匀,所以最好与最大进程数一致 worker_rlimit_nofile 655350; use epoll; 使用epoll 的I/O 模型 补充说明: 与apache相类,nginx针对不同的操作系统,有不同的事件模型 A)标准事件模型 Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll B)高效事件模型 Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD2.0 和 MacOSX. 使用双处理器的MacOSX系统使用kqueue可能会造成内核崩溃。 Epoll: 使用于Linux内核2.6版本及以后的系统。 /dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+(eventport), IRIX 6.5.15+ 和 Tru64UNIX 5.1A+。 Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题,有必要安装安全补丁。 最大连接数 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。 worker_connections 655350; 超时时间 设置超时时间,使用 keepalive_timeout 90;
客户端请求头部缓冲区大小 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 在Linux中,使用getconf PAGESIZE 来获得,并设置给nginx client_header_buffer_size4k; 打开文件缓存大小 这个默认是没有开启的,此参数将为打开文件指定缓存大小 open_file_cachemax=65535 inactive=60s; open_file_cachemax为最大缓存大小,inactive为缓存多久没使用就进行回收
检查缓存有效信息时间 open_file_cache_valid80s;
open_file_cache_min_uses1; open_file_cache 指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。 开启gzip gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x- javascript text/css
application/xml;
gzip_vary on;
缓存静态文件 缓存静态文件:
location ~* ^.+\.(swf|gif|png|jpg|js|css)$ {
root /usr/local/ku6/ktv/show.ku6.com/;
expires 1m;}
Tomcat性能优化1、 最大连接数最大线程等设置 修改server.xml maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。 acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。 connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 minSpareThreads:Tomcat初始化时创建的线程数。 maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程 修改后示例: <Connector port="8082"protocol="HTTP/1.1" useBodyEncodingForURI="true" enableLookups="false"connectionTimeout="30000" maxConnections="2000" acceptCount="2000"maxThreads="1500" minSpareThreads="200" maxSpareThreads="1000"compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata"maxProcessors="1000" minProcessors="5"acceptorThreadCount="10" redirectPort="8443" /> 2、 启动参数设置 修改/bin/catalina.sh,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】' 需要把这个两个参数值调大,大小的可以根据服务器内存的大小进行调整。例如: JAVA_OPTS='-Xms1024m –Xmx2048m' 我们服务器是8G 内存,跑了3个tomcat服务,给分配了2G的内存。
总结以上为nginx+tomcat的性能优化参数调整,个人测试8核16G的服务器中,服务器单点原本没配置优化参数,服务器承载量为1000个并发量,配置成功后,服务器动态并发访问为3000,静态资源并发访问量可达到3500。以此证明参数的配置非常有用,可以提高服务器的稳定性和性能。 但是以上配置非常地片面,具体参数的调整,需要根据服务器的硬件配置来具体调整。 服务器的配置一定是一个灵活的过程,切记不可生搬硬套,只有在多次的压力测试,得到最佳测试结果数据的情况下才是最好的参数配置,以上参数配置只是大多数情况下的一个参考标准。 |