




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、nginx 或 tomcat 的性能优化调整详解性能优化对于服务器来讲肯定是做得越合理越好了,下文我来为各位整理一篇关于 nginx 或 tomcat 的性能优化调整例子,有兴趣的朋友不防和小编一来看看吧。最近花了一点时间进行了 NGINX 加 TOMCAT7 集群压力测试,下面通过对一些常见问题的回答来说明如何调优服务器的性能,是自己的一些经验,且无实际数据,如有纰漏请见谅。背景 : TOMCAT7已加 APR 或者 NIO 。已装简单监控JCONSOLE, 监控服务器内存,线程等基本情况。问题 1一个 Tomcat 他的 maxThreads到底配置多少合适?一个好的maxThreads的
2、配置就是达到资源的合理化应用。资源池:在讲其它东西之前,我们先引入一个概念,就是资源池。 tomcat7 中,他对 http 请求的处理,也有一个池的概念,配置可以参考这里。每一个请求进来后都是使用线程池中的一个来处理,线程池的大小是由maxThreads来限定的。异步 IO:当前 Tomcat 通过使用 JAVA NIO 或者 Apache Portable Runtime 这样的异步 IO 来支持性能的优化。 异步 IO 就是当应用需要进行耗时的 IO 操作时,向内核发出请求,不用真正等 IO 操作完成,就去处理其它的请求了,当IO 真正完成时会有回调或通知机制通知并完成余下工作。而一般的
3、同步IO 是当应用需要IO 操作时,向操作系统发出IO Read/Write请求。同时阻塞当前应用,并等待IO返回,返回后才进行后续的操作。从这里可以看出异步IO实际是将请求的处理和 IO 处理并行了,这样自然能较大的提高系统的吞吐量。maxThreads的大小 :第一点:从上面的异步IO 的机制来看,实际上我们可能可以用一个很小的线程池处理较大的连接数。如当前有100 个请求要被处理, 处理过程中50 个进程都处于IO 等待的状态,所以我们实际可能只需要50 就能够处理那些不处于IO 等待状态的请求就能满足需要了。注意在Tomcat 中是使用maxConnection这个配置参数来配置Tom
4、cat 的同时处理连接数的。第二点:盲目的加大线程数会带来一些下面的影响。由于Tomcat处理的线程均会在操作系统中产生对应的实际线程,这就意味着对应的资源消耗(内存,SOCKET等)。另一个影响就是同时处理的请求加大可能导致JAVA内存回收的问题,不同的并发对内存的占用是不同,而实际上90%的内存都是临时变量,可以很快回收。较大的并发同时占用较多的临时变量就会导致容易撑满年青代,从而导致部分内存进入老年代,从而引起更多的Stop The World,甚至 OOM ,影响 JVM 性能。其它的影响还包括更高的 CPU 占用和更多的硬盘读写。这些实际都跟硬件有关。第三点: 我们可以通过配置一个较
5、合理的资源池,由于资源充裕,单个请求处理迅速,这样能达到最优的系统效率。但是有的时候我们并不总是追求这样的一种情况。比如下载时,单个请求的响应时间将受限于网络,下 100M 的包可能需要 20 分钟,我们就不应该通过一个较小的资源池来提升整体的效率,而应该配置一个较大的资源池,让较多用户连接上并进行下载,否则多数的用户都将会因超时被拒绝,从而造成连接上的超快,连不上的就直接被拒绝。第四点:单个 JVM 的内存分配较大将导致Full Gc(Stop TheWorld) 的中断时间变得更长,影响实时性。高的可达10 秒以上的停顿,这段时间所有的东西将被挂起。配置大小优化思路:配置时应该根据你应用的
6、实际情况,是最占 CPU, 内存还是IO ,最后达到一个平衡就好,下面来说明思路。1.自行保证服务器的资源较够用,如IO 、 CPU 、内存。2.在硬件较充裕的情况下尝试以maxThreads 配置 300 、600 、 1200 、 1800 ,分析 Tomcat 的连接时间,请求耗时,吞吐量等参数。 在测试的时候需要密切注意硬盘、带宽、CPU 、内存是否处于一个瓶颈情况下。3. 其实所有的东西最后都有一个极限就是硬件。应用分CPU ,IO ,内存密集型, 这些都会成为你最终的限制性因素。一般应用根据自己的特性划分到不同的机群中,如CPU 密集型的会分到一群有更好CPU 的集群中。这样可以能
7、充分利用资源。我们以常见的内存为最终限制性因素,并假设CPU 足够好,且IO 很少来说明思路。通过一些压测工具,我们能容易的找到一个在 3008000 的并发数的情况下一个性能的拐点,通过对比不同线程数下请求连接时间、单请求的平均响应时间,总体的吞吐量。这个拐点往往意味着此时的内存回收出现异常, JVM 花了更多的时间在回收内存 ,我们一般可以通过打出 gc 日志,并使用 jmeter 等工具来分析得知。此时你可以尝试优化内存结构或加大内存 来解决,若不能解决,可能就意味你前一次的配置就是一个好的选择。当然这些限制因素是可能互相转换的,可能你增加了内存之后内存没有问题了, 但是却导致 CPU
8、达到 100% ,从而导致性能下降。此时则要以 CPU 为最终限制性因素了。优化测试中陷阱:以一个下载服务器来例子说明。 我们以下载 10m 的包来做测试,其实你会发现整个服务器的吞吐量很差,响应时间慢。但细心的人会发现此时连接服务器的时间却是很快的,也就是说服务器很快 accpet 了你的请求,虽然你的吞吐量不大,处理耗时也大。 原因是什么呢 ,其实是你的带宽已经被占满了,你会发现并发下载 10 个文件就能占满你的所有带宽。所以此时呢你的测试时的对比对象变成了对比连接时间会更加合理。当然你也可以通过减少包的大小,比如降到 1k ,以使带宽不成为瓶颈 .这样可能测试出来你的服务器并发极限量,
9、但该并发量可能并不能反应出实际下载的情况,实际的情况就是带宽容易被占满 ,下载服务器会有一个很大量的连接存在的情况。问题 2. NGINX 到底能带来怎么样的性能提升,或者说有什么好处?1. 测试后发现, NGINX 并不能加快响应的速度, 为什么呢,因为这是由于 NGINX 会代理你同后端的请求。也就意味着你原来只需要建立同服务器的一次连接即可完成请求,现在变成了先同 NGINX 建立连接, NGINX 再同后端建立连接。所以引入 NGINX 后带来了更多的时间消耗,两倍的SOCKET 连接消耗。2. 引入后的好处体现如下。1) 整体的性能会有提升, 通过实测后发现能很大程度上降低最大返回耗
10、时的情况。请求返回更稳定。2) 降低后端的资源消耗。 原来由于客户端网络较慢等因素会让后端在返回数据时处于繁忙的情况,占用资源。通过NGINX 向后端代理,同时由于NGINX 的缓存机制,后端可以快速返回,并将资源更集中用到处理请求上,这样可以发挥后端的能力。 NGINX 在保持大量连接这块就得很优秀,内存, CPU 都占用很少。3) 支持非常方便的扩展,高可用性等。基本的 (优化过的 )配置我们将修改的唯一文件是 nginx.conf ,其中包含 Nginx 不同模块的所有设置。你应该能够在服务器的 /etc/nginx 目录中找到 nginx.conf 。首先,我们将谈论一些全局设置,然后
11、按文件中的模块挨个来,谈一下哪些设置能够让你在大量客户端访问时拥有良好的 x ng能,为什么它们会提高 x ng能。本文的结尾有一个完整的配置文件。nginx 要开启的进程数 一般等于 cpu 的总核数 其实一般情况下开 4个或 8个就可我开 2个以了多了没有太多用每个 nginx 进程消耗的内存10 兆的模样worker_cpu_affinity仅适用于 linux ,使用该选项可以绑定worker 进程和 CPU( 2.4 内核的机器用不了)假如是 8 cpu 分配如下:worker_cpu_affinity 00000001 00000010 00000100 00001000 0001
12、000000100000 01000000 10000000nginx 可以使用多个worker 进程,原因如下:to use SMPto decrease latency when workers blockend on disk I/Oto limit number of connections per process when select()/poll() isusedThe worker_processes and worker_connections from the event sectionsallows you to calculate maxclients value: k
13、max_clients = worker_processes * worker_connectionsworker_rlimit_nofile 102400;每个 nginx 进程打开文件描述符最大数目配置要和系统的单进程打开文件数一致,linux 2.6内核下开启文件打开数为65535 ,worker_rlimit_nofile就相应应该填写 65535nginx 调度时分配请求到进程并不是那么的均衡,假如超过会返回 502 错误。我这里写的大一点use epollNginx 使用了最新的epoll ( Linux 2.6 内核)和kqueue( freebsd )网络 I/O 模型,而 A
14、pache 则使用的是传统的select 模型。处理大量的连接的读写, Apache 所采用的 select 网络 I/O 模型非常低效。在高并发服务器中,轮询 I/O 是最耗时间的操作 目前 Linux 下能够承受高并发访问的 Squid 、Memcached都采用的是 epoll 网络 I/O 模型。worker_connections 65535;每个工作进程允许最大的同时连接数( Maxclient =work_processes *worker_connections)keepalive_timeout 75keepalive超时时间这里需要注意官方的一句话:The paramete
15、rs can differ from each other. Line Keep-Alive:timeout=time understands Mozilla and Konqueror. MSIE itself shutskeep-alive connection approximately after 60 seconds.client_header_buffer_size 16klarge_client_header_buffers 4 32k客户请求头缓冲大小nginx 默认会用 client_header_buffer_size这个 buffer 来读取 header 值,如果hea
16、der 过大,它会使用large_client_header_buffers如果设置过小HTTP 头 /Cookie 过大会报 400错误来读取nginx400 bad request求行如果超过buffer ,就会报 HTTP 414 错误 (URI Too Long)nginx 接受最长的HTTP 头部大小必须比其中一个buffer 大,否则就会报400 的HTTP 错误 (Bad Request)。open_file_cache max 102400使用字段 :http, server, location这个指令指定缓存是否启用,如果启用 ,将记录文件以下信息:打开的文件描述符,大小信息
17、和修改时间 . 存在的目录信息 . 在搜索文件过程中的错误信息 - 没有这个文件 ,无法正确读取 ,参考 open_file_cache_errors 指令选项 : max- 指定缓存的最大数目 ,如果缓存溢出 ,最长使用过的文件(LRU) 将被移除例: open_file_cache max=1000 inactive=20s;open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;open_file_cache_errors语法 :open_file_cache_errors on |
18、 off默认值:open_file_cache_errors off使用字段 :http, server,location这个指令指定是否在搜索一个文件是记录cache错误.open_file_cache_min_uses语法 :open_file_cache_min_uses number默认值:open_file_cache_min_uses 1使用字段:http, server,location这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如 果使用更大的值 ,文件描述符在cache 中总是打开状态.open_file_cache_v
19、alid语法 :open_file_cache_valid time默认值:open_file_cache_valid 60使用字段 :http, server,location这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.开启 gzipgzip 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/cssapplication/xml;gzip_var
20、y on;缓存静态文件:location * .+.(swf|gif|png|jpg|js|css)$ root /usr/local/ku6/ktv/expires 1m;优化 Linux 内核参数vi /etc/sysctl.conf# Addnet.ipv4.tcp_max_syn_backlog = 65536dev_max_backlog = 32768net.core.somaxconn = 32768net.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216n
21、et.core.wmem_max = 16777216net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_tw_recycle = 1#net.ipv4.tcp_tw_len = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_mem = 94500000 915000000 927000000net.ipv4.tcp_max_orphans = 3276800#net.ipv4.tcp_fin_timeout = 30
22、#net.ipv4.tcp_keepalive_time = 120net.ipv4.ip_local_port_range = 1024 65535附录:一些错误排查php-cgi 进程数不够用、php 执行时间长( mysql 慢)、或者是 php-cgi 进程死掉,都会出现502 错误一般来说 Nginx 502 Bad Gateway和 php-fpm.conf的设置有关,而 Nginx 504 Gateway Time-out则是与 nginx.conf的设置有关1、查看当前的PHP FastCGI进程数是否够用:netstat -anpo | grep php-cgi | wc -
23、l如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“ FastCGI进程数”不够用,需要增大。2、部分 PHP 程序的执行时间超过了Nginx 的等待时间,可以适当增加nginx.conf配置文件中FastCGI 的 timeout 时间,例如:http.fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;.413 Request Entity Too Large增大 client_max_body_sizeclient_max_body_size:指令指
24、定允许客户端连接的最大请求实体大小 ,它出现在请求头部的Content-Length字段 . 如果请求大于指定的值,客户端将收到一个Request Entity TooLarge (413) 错误 . 记住 ,浏览器并不知道怎样显示这个错误.php.ini 中增大post_max_size和 upload_max_filesize高层的配置nginx.conf文件中,Nginx 中有 shao 数的几个高级配置在模块部分之上。user www-data;pid /var/run/nginx.pid;worker_processes auto;worker_rlimit_nofile 10000
25、0;user 和 pid 应该按默认设置- 我们不会更改这些内容,因为更改与否没有什么不同。worker_processes定义了 nginx 对外提供 web 服务时的worker 进程数。最优值取决于许多因素,包括(但不限于)CPU 核的数量、 存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU 内核数将是一个好的开始(设置为“auto ”将尝试自动检测它。)worker_rlimit_nofile更改 worker 进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx 可以 ch理比“ ulimit- a”更多的文件,所以把这
26、个值设高, 这样 nginx 就不会有“ too many open files ” 问题了。Events 模块events 模块中包含nginx 中所有 ch理连接的设置。events worker_connections 2048;multi_accept on;use epoll;worker_connections设置可由一个worker 进程同时打开的最大连接数。如果设置了上面提到的 worker_rlimit_nofile ,我们可以将这个值设得很高。记住,最大客户数也由系统的可用socket 连接数限制( 64K ),所以设置不切实际的高没什么好ch。multi_accept告诉
27、 nginx 收到一个新连接通知后接受尽可能多的连接。use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+ ,你应该使用epoll 。如果你使用 *BSD ,你应该使用 kqueue 。(值得注意的是如果你不知道 Nginx 该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)HTTP模块HTTP 模块控制着nginx httpch的所有核心特理x ng因。为这里只有很 shao 的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http 模块中,甚至你不会特别的注意到这段设置。http server_tokens off;sendfile on;tcp_nop
28、ush on;tcp_nodelay on;.server_tokens并不会让 nginx 执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全x ng是有好ch的。sendfile可以让 sendfile() 发挥作用。sendfile() 可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用 read() 将数据从文件拷贝到这个缓冲区,write() 将缓冲区数据写入网络。sendfile() 是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()
29、要比组合read() 和 write() 以及打开关闭丢弃缓冲更加有效( 更多有关于sendfile)。tcp_nopush告诉 nginx 在一个数据包里发送所有头文件,而不一个接一个的发送。tcp_nodelay告诉 nginx 不要缓存数据,而是一段一段的发送-当需要及时发送数据时, 就应该给应用设置这个属 x ng,这样发送一小块数据信息时就不能立即得到返回值。access_log off;error_log /var/log/nginx/error.log crit;access_log 设置 nginx 是否将存储访问日志。 关闭这个选项可以让读取磁盘 IO 操作更快 (aka,Y
30、OLO)error_log告诉 nginx 只能记录严重的错误:keepalive_timeout 10;client_header_timeout 10;client_body_timeout 10;reset_timedout_connection on;send_timeout 10;keepalive_timeout给客户端分配keep-alive 链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让 ngnix 持续工作的时间更长。client_header_timeout和 client_body_timeout设置请求头和请求体 (各自 )的超时时间。我们也可
31、以把这个设置低些。reset_timeout_connection告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。send_timeout指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx 就会关闭连接。limit_conn_zone $binary_remote_addr zone=addr:5m;limit_conn addr 100;limit_conn_zone 设置用于保存各种 key (比如当前连接数)的共享内存的参数。 5m 就是 5 兆字节,这个值应该被设置的足
32、够大以存储 ( 32K*5 )32byte 状态或者 (16K*5 )64byte状态。limit_conn 为给定的 key 设置最大连接数。 这里 key 是 addr ,我们设置的值是 100 ,也就是说我们允许每一个 IP 地址最多同时打开有 100 个连接。include /etc/nginx/mime.types;default_type text/html;charset UTF-8;include只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME 类型。default_type设置文件使用的默认的MIME-type 。charset设
33、置我们的头文件中的默认的字符集gzip on;gzip_disable msie6;# gzip_static on; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 4;gzip_types text/plain text/css application/jsonapplication/x-javascript text/xml application/xmlapplication/xml+rss text/javascript;gzip是告诉 nginx 采用 gzip 压缩的形式发送数据。这将会减 shao 我们发送的数据量
34、。gzip_disable 为指定的客户端禁用 gzip 功能。我们设置成 IE6 或者更低版本以使我们的方案能够广泛兼容。gzip_static告诉 nginx 在压缩资源之前,先查找是否有预先gzipch 理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了) ,从而允许你使用最高压缩比,这样nginx 就不用再压缩这些文件了(想要更详尽的 gzip_static 的信息,请点击这里) 。gzip_proxied允许或者禁止压缩基于请求和响应的响应流。我们设置为any ,意味着将会压缩所有的请求。gzip_min_length 设置对数据启用压缩的最 shao 字节数。如果一个请求
35、小于 1000 字节,我们最好不要压缩它,因为压缩这些小的数据会降低 ch理此请求的所有进程的速度。gzip_comp_level设置数据的压缩等级。 这个等级可以是1-9之间的任意数值,9 是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。gzip_type设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。# cache informations about file descriptors, frequently accessed files# can boost performance, but you need to test those value
36、sopen_file_cache max=100000 inactive=20s;open_file_cache_valid 30s;open_file_cache_min_uses 2;open_file_cache_errors on;# Virtual Host Configs# aka our settings for specific servers#include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;open_file_cache打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20 秒后清除掉。open_file
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司财务台账管理制度
- 生产实习年度工作报告总结(16篇)
- 行政组织行为分析及其意义试题及答案
- 网络自动化运维工具介绍试题及答案
- 爱岗敬业的演讲稿题目(20篇)
- 网络流量监测工具试题及答案
- 2025借款抵押合同(16篇)
- 房产销售代理及佣金结算合同
- 假想的奇幻世界探险经历想象作文14篇
- 优美现代诗歌朗诵(18篇)
- -AAR工具的介绍课件完整版
- 药用菊花规范化种植及深加工项目可研报告
- 文字图形创意课件
- (完整版)普外科出科考试试题
- 残疾青少年与扶持课件
- 冠脉造影术前术后的护理课件
- 2023年云南省肿瘤医院医护人员招聘笔试题库及答案解析
- 2022年市场-饲料销售技巧培训
- 护理风险评估及填写要求
- 微邦生物技术生活污水处理中的应用
- 《港口装卸工艺学》课程设计
评论
0/150
提交评论