我已经谈过一些关于Nginx的常见问题,其中有一些是关于如何优化Nginx,很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行。
我有一些坏消息要告诉你,你不能像Apache一样优化Nginx。它没有魔术配置来减半负载或是让PHP运行速度加快一倍。高兴的是,Nginx已经优化的非常好了,当你决定使用Nginx并用apt-get,yum或是make命令安装的时候它就已经进行了最佳优化。 (注意那些库经常过期,Wiki的安装页面上通常有最新的库)
就是说,很多影响Nginx行为的参数其默认值并不是完全适合高并发的情况。我们也要考虑Nginx运行所在的平台,优化我们的操作系统当有一些限制的时候。
总的来说,我们无法优化单个连接的负载时间,但是我们可以确保Nginx的高并发处理环境。当然, 对于高并发我指的是每秒数百个请求连接,大多数人不需要了解这些。假如你太好奇或是想知道那就继续读吧。
首先,我们需要认识到Nginx几乎可能需要在所有的平台上使用,MacOS,Linux,FreeBSD,Solaris,Windows甚至一些更深奥的系统。他们大部分(这么翻译好些)实现了高性能的基于事件的polling方法,不幸的是Nginx的只支持其中4个系统。在四个系统中我倾向于FreeBSD,但你不会看到太大的性能差异,所以选择的操作系统让你用起来顺手,比选择最优化的操作系统更重要。
我想你一定猜到了windows不在其中。 Windows上的nginx确实没有什么理由让你值得使用。 Windows有自己的一套处理事件polling。 所以nginx的作者选择了不支持。 因此默认的还是使用select() 这种不是很高效而且性能会下降很多的方式。(初次翻译不是很好希望多多指教)
第二个最大的限制, 也是大多数人会遇到的问题是和操作系统相关的。 打开一个
2 :g/567/s//ZZZ/g 替换命令:意思是将每一行中的567替换为ZZZ。在脚本编写中常用。在脚本中使用时要退出编辑模式。注意此命令前面有冒号“:”
3 tar –xf 文件名,tar zxvf 文件名 用于linux系统下,可以解压后缀为tar和tar.gz的压缩包
4 ps -ef,ps -ef|grep -i java 意思是查看java进程,java前面的-i可以不加
5 kill -9 进程号 比如某进程序号为1234,使用kill 1234就可以终止此进程
6 wasHome/AppServer/bin/stopServer.sh server1 -username *** -password *** "终止was服务命令。也可以进入目录wasHome/AppServer/bin/下,使用命令 ./stopServer.sh server1 –username XXX –password XXX。相应的,启动was服务命令就是把stop改为start就可以了。使用此命令时注意字母的大小写
"
7 ssh-keygen -t rsa 生成公钥和私钥命令。用于批量上传或下载之前配置源/目标服务器,使批量传送不需要重复输入密码
8 ll 查看所有文件的读、写、执行权限
9 chmod 使用者 权限 文件名 "授权/削权命令。例如chmod go-rw 123.data,意思是取消群组和其他人读写123.data的权限。其中:rwx也可以用数字来代替r - 4,w - 2,x - 1,“-”的权限值是0。例如chmod 777 123.data,意思是授予所有人读、写、执行权限
"
10 find / -name 文件名 查找文件
11 uname -a,cat /etc/SuSE-release,cat /etc/issue 查看Linux系统属性
12 ssh -P 10022 IP Linux和UVP系统下远程登录命令
13 curlftpfs -o codepage=utf8 ftp://user:password@IP /home/partimag/ Linux系统下挂载镜像(非iso镜像)命令。其中-o是小写字母而不是数字0,user和password通常为admin,IP地址为镜像所在的运维机的地址
14 du -h --max-depth=1 / 显示目录的容量。--max-depth=1的意思是查询的最大深度为1,即至查看一层目录。/是指在跟目录下查询
15 virsh attach/detach-device 虚拟机名 *.xml 在不关闭虚拟机的情况下挂载/卸载磁盘或iso文件。attach为挂载,detach为卸载;虚拟机名就是想要挂载/卸载磁盘或iso文件的虚拟机;*.xml中编辑的内容是挂载/卸载磁盘或iso文件的代码。Windows系统中挂载磁盘的话在磁盘管理中挂载就可以了,挂载cdrom的话要重启虚拟机才能识别到;linux系统中挂载磁盘的话正常挂载就行了,挂载cdrom的话在cdrom中可以看到所挂载的iso文件
16 lftp.sh ftp://admin:admin@10.95.152.93:52121//VRP/VRP_V500R011C01B270_to_ATN/3 在lftp.sh所在的路径路径下使用此命令。ftp的应户名和密码是Admin,152.93是ftp服务器的IP,52121是ftp端口。后面的部分就是要下载的东东的在ftp上的路径。
17 dd if=/usr/vm2/vL10t133052.img of=/usr/vm4/a.img bs=1M oflag=direct 比cp速度更快的复制命令
18 yast2 ntp-client linux时间同步,删除默认server,添加新server:172.19.1.63或者64
19 xenstore-ls -f | grep pvdriver 查看pvdriver版本
20 "curlftpfs –o codepage=utf8 ftp://admin:admin@IP /home/partimag
给网卡端口eth0配置一个临时IP:ifconfig eth0 IP
关闭eth0:ip link set eth0 down
启动eth0:ip link set eth0 up
配置子网掩码:ifconfig eth0 ip netmask ip
配置网关:route add default gw ip
" 搭建apache-ftpserver的相关命令
21 :set nu linux下编辑文件时,显示“第几行”
22 yast2 ntp-client 设置linux时间自动同步(timeserver:szxntp01-in.huawei.com/172.19.1.63)
23 rename 152152 130100 /usr/vm6/* 替换命令:意思是将linux系统路径/usr/vm6/下所有文件名的“152152”的部分改成“130100”
24 把/etc/passwd 文件和/etc/shadow影子文件里的aaa用户的ID值改成0即可 suse系统下给新建的用户授予管理员权限(此方法未验证)
25 xm li|awk 'NR>2 {printf "%s\t%s\n","start ",$1;}' | virsh 启动所有虚拟机
26 xm li|awk 'NR>2 {printf "%s\t%s\n","shutdown ",$1;}' | virsh 关闭所有虚拟机
27 xm li|awk 'NR>2 {printf "%s\t%s\n","undefine ",$1;}' | virsh 取消定义所有虚拟机
28 cat /proc/cpuinfo 查看CPU
29 uvplog -a 命令会自动收集uvp的日志,最后在当前目录下打包生成一个压缩包,压缩包命名类似 uvplog2012xxxxxx_all.tar.gz
30 shutdown -h now 关闭UVP物理机
31 badblocks -s -v /dev/sda linux的硬盘扫描命令。此命令的意思是扫描/dev/sda是否有坏道
32 "压:tar -czf xxx.tar.gz zzz.img
解:tar -xvf xxx.tar.gz" 压缩和解压缩文件。可以把文件压缩到很小。
33 sudo ls "usr"/* 列出目录usr下的所有文件。当权限无法打开某文件夹是需要用此命令,root用户不需要
34 sudo du -sh "usr" 显示目录usr下的所有文件的总大小
35 vi /etc/profile,将“TMOUT=”后面的数字改为0 (通常默认为TMOUT=60,单位是秒)这样设置后,无需重启系统,只要重新登录就不会再出现登陆超时而自动注销
- -Xmx3550m:设置JVM最大堆内存 为3550M。
- -Xms3550m:设置JVM初始堆内存 为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
- -Xss128k:设置每个线程的栈 大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
- -Xmn2g:设置堆内存年轻代 大小为2G。整个堆内存大小 = 年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
- -XX:PermSize=256M:设置堆内存持久代 初始值为256M。(貌似是Eclipse等IDE的初始化参数)
- -XX:MaxNewSize=size:新生成的对象能占用内存的最大值。
- -XX:MaxPermSize=512M:设置持久代最大值为512M。
- -XX:NewRatio=4:设置堆内存年轻代(包括Eden和两个Survivor区)与堆内存年老代的比值(除去持久代) 。设置为4,则年轻代所占与年老代所占的比值为1:4。
- -XX:SurvivorRatio=4:设置堆内存年轻代中Eden区与Survivor区大小的比值 。设置为4,则两个Survivor区(JVM堆内存年轻代中默认有2个Survivor区)与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6。
- -XX:MaxTenuringThreshold=7:表示一个对象如果在救助空间(Survivor区)移动7次还没有被回收就放入年老代。
- 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于年老代比较多的应用,这样做可以提高效率。
- 如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代即被回收的概率。
JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。
默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行智能判断。
串行收集器- -XX:+UseSerialGC:设置串行收集器
- -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
- -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
- -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
- -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间(单位毫秒),如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
- -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时间或者收集频率等。
- 此参数建议使用并行收集器时,一直打开。
- -XX:+UseParNewGC:设置年轻代为并发收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
- CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少FullGC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。
- -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了。所以,此时年轻代大小最好用-Xmn设置。
- -XX:CMSFullGCsBeforeCompaction=:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此参数设置运行次FullGC以后对内存空间进行压缩、整理。
- -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除内存碎片。
- -XX:+CMSIncrementalMode:设置为增量收集模式。一般适用于单CPU情况。
- -XX:CMSInitiatingOccupancyFraction=70:表示年老代空间到70%时就开始执行CMS,确保年老代有足够的空间接纳来自年轻代的对象。
注:如果使用 throughput collector 和 concurrent low pause collector 这两种垃圾收集器,需要适当的挺高内存大小,为多线程做准备。
其它- -XX:+ScavengeBeforeFullGC:新生代GC优先于Full GC执行。
- -XX:-DisableExplicitGC:禁止调用System.gc(),但JVM的gc仍然有效。
- -XX:+MaxFDLimit:最大化文件描述符的数量限制。
- -XX:+UseThreadPriorities:启用本地线程优先级API,即使 java.lang.Thread.setPriority() 生效,反之无效。
- -XX:SoftRefLRUPolicyMSPerMB=0:“软引用”的对象在最后一次