Centos5.5最小化安装后的优化

Linux就该这么学

购买了服务器(现在主流配置都是双四核),下一步就要安装系统了。这里推荐用64位的Centos5.5,安装系统时我们要选择最小化安装(不要图形)。大家在用服务器时要记得一个原则,系统的安装包越少越好,这样机器才会更稳定。前面已经介绍过线上服务器的分区流程,如果遇到对磁盘I/O调用频繁的服务(例如MySQL),我们可以单独拿一个分区(/data)出来,不要跟/装在一起,避免/分区被频繁调用,出现I/O瓶颈。至于单服务器的性能调优,本着稳定安全的原则,尽量不要改动系统原有的配置(Centos自身的文件和内存机制就很优秀),尤其是线上环境,稳定性要放在第一位来考虑。

1.关闭不需要的服务

众知周知,服务越少,系统占用的资源也会越少,所以应关闭不需要的服务。这样做的好处是减少内存和CPU时间的占用。命令如下所示:

<!--[if !supportLists]-->1.        <!--[endif]--># ntsysv 

下面列出需要启动的服务,未列出的服务一律关闭。

crond

Linux下的时间计划任务服务。

irqbalance

启用irqbalance服务,既可以提升性能,又可以降低能耗。irqbalance用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将工作置于Performance modePower-save mode状态。处于Performance mode时,irqbalance会将中断尽可能均匀地分发给各个CPU core,以充分利用CPU的多核,提升性能。处于Power-save mode时,irqbalance会将中断集中分配给第一个CPU,以保证其他空闲CPU的睡眠时间,降低能耗。现在的主流服务器都是双四核,所以这项我建议保留。

network

sshd

syslog

这是Linux的日志系统,必须要启动,否则机器出现问题时会找不到原因。

再说一下两个比较特殊的服务,它们是iptablesSELinux。因为网站和系统之前均有硬件防火墙,如果没有特殊需求的话,均可选择关闭。要关闭它们可以在命令setup下操作,也可以使用命令行操作。

关闭iptables的代码如下:

  1. # service iptables stop && #chkconfig iptables off  

关闭SELinux的方法如下:

  1. # vim /etc/selinux/config  

然后将文件中的selinux=""改为disabled,并重启。如果不想重启系统,使用命令setenforce 0,此命令可以暂时关闭SELinux,重启后失效。

说明 setenforce 1SELinux设置成为enforcing模式;setenforce 0SELinux设置成为permissive模式。

另外,在lilogrub的启动参数中增加:selinux=0,这样也可以关闭SELinux

2.关闭不需要的tty

先编辑/etc/inittab,找到如下一段命令:

  1. 1:2345:respawn:/sbin/mingetty tty1   
  2. 2:2345:respawn:/sbin/mingetty tty2   
  3. 3:2345:respawn:/sbin/mingetty tty3   
  4. 4:2345:respawn:/sbin/mingetty tty4   
  5. 5:2345:respawn:/sbin/mingetty tty5   
  6. 6:2345:respawn:/sbin/mingetty tty6  

这段命令会使init为你打开了6个控制台,分别可以用[ALT+F1]到[ALT+F6]进行访问。此6个控制台默认都驻留在内存中,用ps -aux这个命令就可以看到,这是6个进程,如下所示:

  1. [root@localhost ~]# ps -aux| grep tty  
  2. Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ 
  3. root      1461  0.0  0.0   3972   520 tty1     Ss+  Aug13   0:00 /sbin/mingetty /dev/tty1 
  4. root      1463  0.0  0.0   3972   516 tty2     Ss+  Aug13   0:00 /sbin/mingetty /dev/tty2 
  5. root      1465  0.0  0.0   3972   520 tty3     Ss+  Aug13   0:00 /sbin/mingetty /dev/tty3 
  6. root      1467  0.0  0.0   3972   516 tty4     Ss+  Aug13   0:00 /sbin/mingetty /dev/tty4 
  7. root      1469  0.0  0.0   3972   520 tty5     Ss+  Aug13   0:00 /sbin/mingetty /dev/tty5 
  8. root      1471  0.0  0.0   3972   520 tty6     Ss+  Aug13   0:00 /sbin/mingetty /dev/tty6 
  9. root     11633  0.0  0.0 103160   824 pts/0    S+   15:07   0:00 grep tty 
  10. [root@localhost ~]#  

事实上没有必要使用这么多。应如何关闭不需要的进程呢?通常我们保留前两个控制台就可以了,把后面4个用#注释掉,并且无需重启,只需要执行init q这个命令即可,如下所示:init q

3.TCP/IP网络参数进行调整

调整TCP/IP网络参数,可以增强抗SYN Flood的能力,命令如下所示:

  1. # echo 'net.ipv4.tcp_syncookies = 1>> /etc/sysctl.conf   
  2. # sysctl -p  

4.修改shell命令的history记录个数

修改history记录的命令如下所示:

  1. # vi /etc/profile  

找到histsize=1000,将其改为histsize=100(这条可根据实际情况而定)

不重启系统就可让其生效,如下所示:

  1. source /etc/profile  

5.定时校正服务器的时间

我们可以定时校正服务器的时间,命令如下所示:

  1. # yum install ntp   
  2.  
  3. # crontab -e  

加入如下一行:

  1. */5 * * * * ntpdate ntp.api.bz  
  1. #ntp.api.bz是一组NTP服务器集群,目前有6台服务器。这项服务是api.bz继http://sms.api.bz移动飞信免费短信发送接口之后的第二项免费API服务。 

6.停止打印服务

如果不准备提供打印服务,可停止默认设置为自动启动的打印服务,命令如下所示:

  1. [root@sample ~]#/etc/rc.d/init.d/cups stop ← 停止打印服务Stopping cups:    [OK]  ← 停止服务成功,出现“OK”   
  2. [root@sample ~]#chkconfig cups off ← 禁止打印服务自动启动   
  3. [root@sample ~]#chkconfig -list cups ← 确认打印服务自启动设置状态   
  4.      cups0:off 1:off 2:off 3:off 4:off 5:off 6:off ← 0~ 
  5. 6都为off的状态就OK(当前打印服务自启动被禁止)  

7.停止ipv6

Centos5.5默认的状态下,ipv6是被启用的。因为我们不使用ipv6,所以,可以停止ipv6,以最大限度地保证安全和快速。首先确认一下ipv6是不是处于被启动的状态。

  1. [root@sample ~]#ifconfig -a ← 列出全部网络接口信息   
  2. eth0 Link encap:Ethernet HWaddr 00:0C:29:B6:16:A3   
  3. inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0   
  4. inet6 addr: fe80::20c:29ff:feb6:16a3/64 Scope:Link   
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1   
  6. RX packets:84 errors:0 dropped:0 overruns:0 frame.:0   
  7. TX packets:93 errors:0 dropped:0 overruns:0 carrier:0   
  8. collisions:0 txqueuelen:1000   
  9. RX bytes:10288 (10.0 KiB) TX bytes:9337 (9.1 KiB)   
  10. Interrupt:185 Base address:0×1400   
  11. lo Link encap:Local Loopback   
  12. inet addr:127.0.0.1 Mask:255.0.0.0   
  13. inet6 addr: ::1/128 Scope:Host   
  14. UP LOOPBACK RUNNING MTU:16436 Metric:1   
  15. RX packets:12 errors:0 dropped:0 overruns:0 frame.:0   
  16. TX packets:12 errors:0 dropped:0 overruns:0 carrier:0   
  17. collisions:0 txqueuelen:0   
  18. RX bytes:952 (952.0 b) TX bytes:952 (952.0 b)   
  19. sit0 Link encap:IPv6-in-IPv4 ← 确认ipv6是被启动的状态   
  20. NOARP MTU:1480 Metric:1   
  21. RX packets:0 errors:0 dropped:0 overruns:0 frame.:0   
  22. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0   
  23. collisions:0 txqueuelen:0   
  24. RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)  

然后修改相应配置文件,停止ipv6,如下所示:

  1. [root@sample ~]#vi /etc/modprobe.conf ← 修改相应配置文件,添加如下内容   
  2. alias net-pf-10 off   
  3. alias ipv6 off   
  4. echo "IPV6INIT=no>> /etc/sysconfig/network-scripts/ifcfg-eth0   
  5. [root@sample ~]#shutdown -r now ← 重新启动系统,使设置生效  

最后确认ipv6的功能已经被关闭,如下所示:

  1. [root@sample ~]#ifconfig -a ← 列出全部网络接口信息    
  2. eth0 Link encap:Ethernet HWaddr 00:0C:29:B6:16:A3   
  3. inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0   
  4. inet6 addr: fe80::20c:29ff:feb6:16a3/64 Scope:Link   
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1   
  6. RX packets:84 errors:0 dropped:0 overruns:0 frame.:0   
  7. TX packets:93 errors:0 dropped:0 overruns:0 carrier:0   
  8. collisions:0 txqueuelen:1000   
  9. RX bytes:10288 (10.0 KiB) TX bytes:9337 (9.1 KiB)   
  10. Interrupt:185 Base address:0×1400lo Link encap:Local Loopback   
  11. inet addr:127.0.0.1 Mask:255.0.0.0   
  12. inet6 addr: ::1/128 Scope:Host   
  13. UP LOOPBACK RUNNING MTU:16436 Metric:1   
  14. RX packets:12 errors:0 dropped:0 overruns:0 frame.:0   
  15. TX packets:12 errors:0 dropped:0 overruns:0 carrier:0   
  16. collisions:0 txqueuelen:0   
  17. RX bytes:952 (952.0 b) TX bytes:952 (952.0 b)  

确认ipv6的相关信息没有被列出,说明ipv6功能已经关闭。

1.5.2 Centos5.5最小化安装后的优化(3

8.调整Linux的最大文件打开数

要调整一下Linux的最大文件打开数,否则squid在高负载时执行性能将会很低。另外,在Linux下面部署应用时,有时候会遇上Socket/File:Cant open so many files这样的问题,这个值也会影响服务器的最大并发数。其实Linux是有文件句柄限制的,但默认不是很高,一般是1024,生产服务器很容易就会达到这个值,所以需要改动此值。刚开始我采用vim/etc/security/limit.conf命令,在最后一行添加如下代码:

  1. * soft nofile 60000   
  2. * hard nofile 65535  

但重启后一切都还原了。

正解做法应该为在Centos5.5/etc/rc.local文件里添加如下命令行:

  1. ulimit -SHn 65535  

当然了,我们也可以在Nginx的一些监控脚本里实时添加此命令行,达到重启也能生效的目的。

另外,ulimit -n命令并不能真正看到文件的最大文件打开数,大家可用如下脚本查看:

  1. #!/bin/bash   
  2. for pid in 'ps aux |grep nginx |grep -v grep|awk '{print$2}''   
  3. do   
  4. cat /proc/${pid}/limits |grep 'Max open files'   
  5. done  

9.启动网卡

大家配置Centos5.5的网卡时,容易忽略的一项就是Linux启动时未启动网卡,其后果很明显,那就是你的Linux机器永远也没有IP地址,下面是一台线上服务器的配置:

  1. [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0   
  2.  # Intel Corporation 82541GI Gigabit Ethernet Controller   
  3. DEVICE=eth0  
  4. BOOTPROTO=none  
  5. HWADDR=00:14:22:1B:71:20   
  6. IPV6INIT=yes  
  7. IPV6_AUTOCONF=yes  
  8. ONBOOT=yes →此项一定要记得为yes,它会在系统引导就启动你的网卡设备   
  9. NETMASK=255.255.255.192   
  10. IPADDR=203.93.236.146   
  11. GATEWAY=203.93.236.129   
  12. TYPE=Ethernet  
  13. PEERDNS=yes →允许从DHCP处获得的DNS覆盖本地的DNS   
  14. USERCTL=no~ →不允许普通用户修改网卡  

10.关闭Centos5.5的写磁盘I/O功能

一个Linux文件默认有3个时间。

atime:对此文件的访问时间。

ctime:此文件inode发生变化的时间。

mtime:此文件的修改时间。

如果有多个小文件(比如Web服务器的页面上有多个小图片),通常就没有必要记录文件的访问时间了,这样可以减少写磁盘的I/O。这要如何配置呢?

首先,修改文件系统的配置文件:vim /etc/fstab。然后,在包含大量小文件的分区中使用noatimenodiratime这两个命令。例如:

<!--[if !supportLists]-->1.        <!--[endif]-->/dev/sda5 /data/pics ext3 noatime,nodiratime 0 0 

这样文件被访问时就不会再产生写磁盘的I/O了。

 

1.5.3 优化Linux下的内核TCP参数以提高系统性能

内核的优化跟服务器的优化一样,应本着稳定安全的原则。下面以64位的Centos5.5下的Squid服务器为例来说明,待客户端与服务器端建立TCP/IP连接后就会关闭SOCKET,服务器端连接的端口状态也就变为TIME_WAIT了。那是不是所有执行主动关闭的SOCKET都会进入TIME_WAIT状态呢?有没有什么情况使主动关闭的SOCKET直接进入CLOSED状态呢?答案是主动关闭的一方在发送最后一个ACK后就会进入TIME_WAIT状态,并停留2MSL(Max Segment LifeTime)时间,这个是TCP/IP必不可少的,也就是“解决”不了的。

TCP/IP的设计者如此设计,主要原因有两个:

防止上一次连接中的包迷路后重新出现,影响新的连接(经过2MSL时间后,上一次连接中所有重复的包都会消失)

为了可靠地关闭TCP连接。主动关闭方发送的最后一个ACK(FIN)有可能会丢失,如果丢失,被动方会重新发FIN,这时如果主动方处于CLOSED状态,就会响应RST而不是ACK。所以主动方要处于TIME_WAIT状态,而不能是CLOSED状态。另外,TIME_WAIT并不会占用很大的资源,除非受到攻击。

Squid服务器中可输入查看当前连接统计数的命令,如下所示:

  1. #netstat -n| awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'   
  2. LAST_ACK 14   
  3. SYN_RECV 348   
  4. ESTABLISHED 70   
  5. FIN_WAIT1 229   
  6. FIN_WAIT2 30   
  7. CLOSING 33   
  8. TIME_WAIT 18122  

CLOSED:无连接是活动的或正在进行中的。

LISTEN:服务器在等待进入呼叫。

SYN_RECV:一个连接请求已经到达,等待确认。

SYN_SENT:应用已经开始,打开一个连接。

ESTABLISHED:正常数据传输状态。

FIN_WAIT1:应用说它已经完成。

FIN_WAIT2:另一边已同意释放。

CLOSING:两边同时尝试关闭。

TIME_WAIT:另一边已初始化一个释放。

LAST_ACK:等待所有分组死掉。

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

Linux下高并发的Squid服务器中,TCP TIME_WAIT套接字数量经常可达两三万,服务器很容易就会被拖死。不过,我们可以通过修改Linux内核参数来减少Squid服务器的TIME_WAIT套接字数量,命令如下所示:

  1. # vim /etc/sysctl.conf  

然后,增加以下参数:

  1. net.ipv4.tcp_fin_timeout = 30  
  2. net.ipv4.tcp_keepalive_time = 1200  
  3. net.ipv4.tcp_syncookies = 1  
  4. net.ipv4.tcp_tw_reuse = 1  
  5. net.ipv4.tcp_tw_recycle = 1  
  6. net.ipv4.ip_local_port_range = 1024 65000   
  7. net.ipv4.tcp_max_syn_backlog = 8192  
  8. net.ipv4.tcp_max_tw_buckets = 5000  

其中:

  1. net.ipv4.tcp_syncookies=1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击。默认为0,表示关闭。 
  2.  
  3. net.ipv4.tcp_tw_reuse=1表示开启重用。允许将TIME-WAIT套接字重新用于新的TCP连接。默认为0,表示关闭。 
  4.  
  5. net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME-WAIT套接字的快速回收。默认为0,表示关闭。 
  6.  
  7. net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。 
  8.  
  9. net.ipv4.tcp_keepalive_time=1200表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,这里改为20分钟。 
  10.  
  11. net.ipv4.ip_local_port_range=1024 65000表示向外连接的端口范围。默认值很小:32768~61000,改为1024~65000。 
  12.  
  13. net.ipv4.tcp_max_syn_backlog=8192表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 
  14.  
  15. net.ipv4.tcp_max_tw_buckets=5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,前面介绍的几个参数已经可以很好地减少TIME_WAIT套接字数量,但是对于Squid来说,效果却不大。有了此参数就可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。 

执行以下命令使内核配置立即生效: 

<!--[if !supportLists]-->1.        <!--[endif]-->/sbin/sysctl -p 

如果是用于ApacheNginx等的Web服务器,或Nginx的反向代理,则只需要更改以下几项即可:

  1. net.ipv4.tcp_syncookies=1  
  2. net.ipv4.tcp_tw_reuse=1  
  3. net.ipv4.tcp_tw_recycle = 1  
  4. net.ipv4.ip_local_port_range = 1024 65000  

执行以下命令使内核配置立即生效: /sbin/sysctl -p如果是邮件服务器,则建议内核方案如下:

  1. net.ipv4.tcp_fin_timeout = 30  
  2. net.ipv4.tcp_keepalive_time = 300  
  3. net.ipv4.tcp_tw_reuse = 1  
  4. net.ipv4.tcp_tw_recycle = 1  
  5. net.ipv4.ip_local_port_range = 5000 65000   
  6. kernel.shmmax = 134217728  

执行以下命令使内核配置立即生效: /sbin/sysctl -p

当然这些都只是最基本的更改,大家还可以根据自己的需求来更改内核的设置,同样也要本着稳定的原则,如果服务器不稳定的话,一切工作和努力都会白费。如果以上优化仍无法满足你的要求,有可能你需要定制你的服务器内核或升级服务器硬件。至于服务的配置优化,超出了本章的内容,大家可根据自己的需求有针对性地进行更改。

 

本文由 CentOS中文站 - 专注Linux技术 作者:centos 发表,其版权均为 CentOS中文站 - 专注Linux技术 所有,文章内容系作者个人观点,不代表 CentOS中文站 - 专注Linux技术 对观点赞同或支持。如需转载,请注明文章来源。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注