《构建高可用Linux服务器 第3版》—— 1.5 Linux服务器的优化-阿里云开发者社区

开发者社区> 华章出版社> 正文

《构建高可用Linux服务器 第3版》—— 1.5 Linux服务器的优化

简介:

本节书摘来自华章出版社《构建高可用Linux服务器 第3版》一 书中的第1章,第1.5节,作者:余洪春 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5 Linux服务器的优化

服务器的优化是我们最小化安装系统时应该做的事情。其实,在做这项工作之前,我们就应该根据实际应用需求来选购Linux服务器,然后有所偏重地选择硬件,比如我们应该根据服务器的应用来确定是需要RAID 5,还是单块硬盘等。

1.5.1 如何根据服务器应用来选购服务器

无论是租用还是托管都要面临一个问题,那就是选择服务器的硬件配置,前面也说了,选购硬件配置时要根据我们的服务器应用需求而定。因为你无法通过一台服务器来满足所有的需求,解决所有的问题。在项目实施或网站架构之前,我们应该从以下方面来考虑如何选购Linux服务器:

服务器运行什么应用?

需要支持多少用户访问?

需要多大空间来存储数据?

业务有多重要?

服务器网卡方面的考虑。

安全方面的考虑。

机架合理化安排了没?

服务器的价格超出项目预算了没?

下面分别来看一下。

1.服务器运行什么应用

这是首先需要考虑的问题,我们通常根据服务器的应用类型(即用途)来决定服务器的性能、容量和可靠性需求。下面将按照负载均衡、缓存服务器、前端服务器+应用程序服务器+数据服务器的常见基础架构来讨论。

负载均衡端:它对服务器的要求非常低,尤其是用来做LVS负载时,它会直接将所有的连接要求转给后端的Web应用。所以,在保证网卡性能的前提下(很多时候我用的是品牌服务器自带的百兆网卡),可以将性能相对较差的配置用作负载均衡。

缓存服务器:主要是squid或varnish等,需要重点考虑两方面的因素,即内存容量尽量大些,硬盘存取速度尽量快些,不要因为硬盘的I/O影响整体性能。

Web前端:正常情况下,大多数Web前端服务器(front-end)对服务器的要求不高,例如静态Web服务器、动态服务器、图片服务器等,事实上现在很流行在一台性能卓越的服务器上同时运行Web前端+应用服务器,比如Nginx+FastCGI、Nginx+Tomcat或Nginx+ Resin。

应用服务器:由于它承担了计算和功能实现的重任,我们需要为基于Web架构的应用程序服务器选择足够快的服务器,另外应用程序服务器可能需要用到大量的内存,尤其是基于Windows基础架构的Ruby、Python、Java服务器,这一类服务器至少需要使用单路至强的配置。至于可靠性的问题,如果你的架构中只有一台应用服务器,那肯定需要这台服务器足够可靠,RAID是绝对不能忽视的选项。但如果有两台或更多的应用服务器,并设计了负载均衡机制,具有冗余功能,那就不必过于担心了。

特殊的应用:除了用于Web架构中的应用程序之外,如果你的服务器还要处理流媒体视频编码、服务器虚拟化、媒体服务器(Asterisk之类),或者作为游戏服务器(逻辑、地图、聊天)运行,那同样会对CPU和内存的需求比较高,至少也要考虑单路至强的服务器。其中,服务器虚拟化对存储可靠性的要求非常高,因为一个篮子里有十几个鸡蛋,篮子一定要足够牢靠才行。

公共服务:这里指的是邮件服务器、文件服务器、DNS服务器、域控服务器等。通常我们会部署两台DNS服务器互相备份,域控主服务器也会拥有一台备份服务器(专用的或非专用的),所以对于可靠性,无须过于苛刻。至于邮件服务器,至少需要具备足够的硬件可靠性和容量大小,这主要是对邮件数据负责,因为很多用户没有保存和归档邮件数据的习惯,待其重装系统后,就会习惯性地到服务器上重新下载相应的数据。至于性能问题,则应评估用户数量后再决定。另外,考虑到它的重要性,建议还要尽量选择稳定的服务器系统,比如Linux或BSD系列。

数据库:这是我们最后讨论的应用,对服务器的要求也是最高、最重要的。无论你使用的是MySQL、SQL Server还是Oralce,一般情况下,它都需要有足够快的CPU、足够大的内存、足够稳定可靠的硬件。可直接采用Dell PowerEdge R710或HP 580G5,CPU和内存方面也要尽可能最大化,如果预算充分,建议用固态硬盘做RAID 1+0,因为数据库服务器对硬盘的I/O要求是最高的。

2.服务器需要支持的用户访问量

服务器就是为了给用户提供某种服务的,所以使用这些服务的用户同样是我们必须考虑的因素,我们可以从下面几个具体的问题进行评估。

有多少注册用户?

正常情况下有多少用户会同时在线访问?

每天同时在线访问的最高峰值大概是多少?

一般在项目实施之前,客户方面会针对这些问题给出一个大致的结果。但我们尽量要设计得比这更充分和具体。同时,我们还要对未来的用户增长做一个尽可能准确的预测和规划,因为你的服务器可能会支持越来越多的用户。所以在进行网站或系统架构时要让机器能灵活扩展。

3.需要的存储数据空间

关于这个问题需要从两个方面来考虑,一方面是有哪些类别的数据,包括:操作系统本身占用的空间、安装应用程序所需要的空间、应用程序所产生的数据、数据库、日志文件、邮件数据等,如果网站是Web 2.0的,还要计算每个用户的存储空间;另一方面是从时间轴上来考虑,这些数据每天都在增长,你至少要为未来1年(我们建议考虑2~3年)的数据增长做个准确测算,这就需要软件开发人员和业务人员一起提供足够的信息。最后你将计算出来的结果乘上1.5左右的系数,方便维护的时候做各种数据的备份和文件转移操作。

4.业务的重要性

关于这个问题就需要根据自身的业务领域来考虑相关要求了,下面举几个简单的例子,帮助你了解这些服务器对可靠性、数据完整性等方面的要求。

如果你的服务器是用来运行一个WordPress博客,与朋友们分享观点的。那么,一台酷睿服务器,4GB的内存外加一块500GB的硬盘就足够了。就算服务器出现了一点硬件故障,导致几个小时甚至一两天不能提供访问,生活会照常继续。

如果你的服务器是用作测试平台的,那么就不会如生产环境那样对可靠性有极高的要求,你所需要的可能只是做好例行的数据备份,若服务器宕机,只要能在当天解决问题就没问题了。

如果是一个电子商务公司的服务器,运行着电子商务网站平台,当硬件发生故障而导致宕机时,你需要对以下“危言耸听”的后果做好心理准备:投诉电话被打爆、顾客大量流失、顾客要求退款、市场推广费用打水漂、员工无事可干、公司运营陷入瘫痪状态、数据丢失。事实上,电子商务网站一般是需要365×24小时不间断监控的,而且要有专人轮流值守,并且要有足够的备份设备,每个天还要有专人检查。

如果是大型广告类或门户类网站,那么建议选择CDN系统。由于它带有提高网站响应速度、负载均衡、有效抵御DDOS攻击等特点,相对而言,每个节点都会有大量的冗余。所以,除了成本之外,CDN机器的硬盘问题不大。

这里其实只是简单讨论了业务对服务器硬件可靠性的要求。换言之,如果你觉得业务不能承担硬盘损坏带来的停机或数据丢失风险,那么一定要选择一个合适的RAID卡。对于冗余电源问题,道理是一样的(要全面解决这个问题,不能只考虑单台服务器的硬件,还需要结合系统架构的规划设计)。

在回答了以上问题后,接下来就可以决定下面这些具体选项了。

(1)选择什么CPU

回忆一下上面关于“服务器运行什么应用”和“需要支持多少用户访问”两个方面的考虑,这将帮助我们选择合适的CPU。毫无疑问,CPU的主频越高,其性能也就更高;两个CPU要比一个CPU更好,至强肯定比酷睿性能更强大。但究竟怎样的CPU才是合适的呢?下面提供了一些常见情况下的建议:

如果你的业务刚刚起步,预算不充足,建议你选择一款经典的酷睿服务器,这可以帮你节约大量成本。而且,以后你可以根据业务发展的情况,随时升级到更高配置的服务器。

如果你需要在一台服务器上同时运行多种应用服务,例如.NET+Exchange+SQLServer,那么一个单核至强(例如X3330)或新一代的酷睿i5(双核四线程)将是最佳的选择。虽然从技术的角度来说,这不是一个好主意,但至少能够帮你节约一大笔成本。

如果你的服务器要运行SQL Server、MySQL或Oracle,而且目前有几百个用户同时在线,未来还会不断增长,那么你至少应该选择安装一台双四核服务器。

如果需要的是Web应用服务器,双四核基本就可以满足要求。

(2)需要多大的内存

同样,“服务器运行什么应用”和“需要支持多少用户访问”两方面的考虑也将帮助我们选择合适的内存容量。相比于CPU,我认为内存(RAM)才是影响性能的最关键因素。因为在相当多正在运行的服务器中,CPU的利用率一般都在10%~30%,甚至更低。但我们发现由于内存容量不够而导致服务器运行缓慢的案例比比皆是,如果服务器不能分配足够的内存给应用程序,应用程序就需要通过硬盘接口缓慢地交换读写数据了,这将导致网站慢得令人无法接受。内存的大小主要取决于服务器的用户数量,当然也和应用软件对内存的最低需求和内存管理机制有关,所以,最好由你的程序员或软件开发商给出最佳的内存配置建议。下面同样给出了一些常见应用环境下的内存配置建议:

无论是Windows下的IIS还是Linux下的Apache,一般情况下Web前端服务器不需要配置特别高的内存,尤其是在集群架构中,4GB的内存就已经足够了。如果有几千个并发用户,而且他们同时运行动态脚本程序,我们才会考虑使用8GB或更高的内存。如果是单Apache服务器的线上环境,配置了16GB内存后,可以处理6000或者更高的并发量。

对于运行Tomcat、Resin、WebLogic、Websphere或.NET的应用服务器,4GB内存应该是基准配置,更准确的数字需要根据用户数量和技术架构来确定。

数据库服务器的内存由数据库实例的数量、表大小、索引、用户数来决定,一般建议配置4GB以上的内存,我们在许多项目方案中使用了24~48GB的内存。

诸如Postfix、Notes、Exchange这样的邮件服务器对内存的要求并不高,1~2GB就可以满足要求。

还有一些特殊的服务器,我们需要为之配置尽可能高的内存容量,包括Squid、Varnish、Memcached的缓存服务器。

对于一台文件服务器,1GB内存可能就足够了。

事实上,由于内存技术在不断进化和价格也在不断降低,我们才得以近乎奢侈地讨论4GB、8GB、16GB这些曾经不可想象的内存容量。然而,除了花钱购买内存来满足应用程序的“贪婪”之外,系统优化和数据库优化仍然是我们需要重视的问题。

(3)需要怎样的硬盘存储系统

硬盘存储系统的选择和配置是整个服务器系统里最复杂的一部分,我们需要考虑硬盘的数量、容量、接口类型、转速、缓存大小,以及是否需要RAID卡、RAID卡的型号和RAID级别等问题。甚至在一些高可靠性高性能的应用环境中,我们还需要考虑使用怎样的外部存储系统(SAN、NAS或DAS)。服务器的硬盘RAID卡的特点归纳如下:

如果用作缓存服务器,比如squid、varnish及memcached,可以考虑用RAID 0;

如果运行Nginx+PHP5或tomcat、resin等应用,可以考虑用RAID 1;

如果是内网开发服务器或存放重要代码的服务器,可以考虑用RAID 5;

如果运行MySQL或Oracle等数据库应用,可以考虑用SAS或者固态硬盘做RAID 5或RAID 1+0。

5.网卡性能与数据方面的考虑

如果你的基础架构是多服务器环境,而且服务器之间有大量的数据交换,那么建议为每台服务器配置两块或更多的网卡,一块用来对外提供服务,另一块用来做内部数据交换。由于现在项目外端都置于防火墙内,所以许多时候单网卡就足够了;而比如LVS+Keepalived这种只用公网地址的Linux集群架构,有时可能仅仅需要一块网卡。目前,HP或DELL这种品牌服务器自带的网卡已经足够使用了。

另外,数据的备份也很重要。在实际工作中我们发现,rsync和scp这些Linux下的备份工具同样非常占带宽,所以如果用scp,建议尽量用它的限速参数;而rsync则尽量选择在非业务时间段执行。

6.服务器安全方面的考虑

由于目前国内的DDOS攻击还比较普遍,建议给每个项目方案和自己的电子商务网站配备硬件防火墙,比如Juniper、Cisco或神盾等。当然,这个问题也是网站后期运营维护需要考虑的,这里只是想让大家有个概念性的认识。有时为了数据的安全,我会让所有机器用的都是RAID 5,另外就是定期巡视机房,检查服务器的硬盘灯指向,一有异常就紧急处理。

7.根据机架数合理安排服务器的数量

这个问题应该在项目实施前就准备好,选择服务器时应该明确1U、2U和4U到底有多少台,应该如何安排。在小项目中这个问题可能无关紧要,但在大型项目的实施过程中,这个问题就很突出了,我们应该根据现有或额定的机架数目确定到底应该选择多少台服务器。

8.成本考虑:服务器的价格问题

无论是在替公司采购时,还是在项目实施过程中,这个问题都是重要的问题。我们的方案经常被退回,理由就是超出预算。尤其在一些小项目中,预算更吃紧。我做项目时经常面临的需求是客户做的是证券类资讯网站,只要求周一至周五的九点至下午三点网站不出问题即可,并不想做复杂的负载均衡高可用。所以这时候,我会做成单Nginx或HAProxy,后面接两台Web应用,这种情况还好说,如果是做中大型电子商务网站,在服务器成本上的控制就尤其重要。事实上,我们经常出现的问题是,客户给出的成本预算有限,而我们的应用又需要更多的服务器,这时候,我们不得不选择CentOS 5.8下的免费虚拟化软件,这将在后面的章节中重点讲述。

以上8个方面是我们在采购服务器时应该注意的因素,在选择服务器的组件时要有所偏重,然后根据系统或网站架构来决定服务器的数量,尽量做到服务器资源利用最大化。

1.5.2 CentOS 5.8最小化安装后的优化

添置了新服务器以后,下一步就要安装系统了。这里推荐用CentOS 5.8 x86_64,大家在用服务器时抱着一个原则:系统安装的应用程序包越少,服务器会越稳定,所以我们安装系统时尽量选择最小化安装。至于服务器的单机性能调优,本着稳定安全的原则,尽量不要改动系统原有的配置(CentOS自身的文件和内存机制就很优秀)。

1.关闭不需要的服务

众所周知服务越少,系统占用的资源就会越少,所以应关闭不需要的服务。

建议关闭不需要的服务,这样做的好处是减少内存和CPU时间的占用。命令如下所示:

# ntsysv```
下面列出需要启动的服务,未列出的服务一律关闭:

crond:自动计划任务。

network:已配置网络接口的脚本程序服务。

sshd:openssh服务器守护进程。

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

syslog:Linux的日志系统服务,必须启动,否则机器出现问题时会找不到原因。

再说下两个比较特殊的服务,它们是iptables和SELinux。如果系统没有特殊需求,这两个服务均可选择关闭,要关闭它们可以在命令setup下操作,也可以使用命令行操作。

关闭iptables的代码如下:


service iptables stop && chkconfig iptables off
关闭SELinux的代码如下:


vim /etc/selinux/config
然后将文件中的SELINUX="enforcing"改为disabled,并重启。如果不想重启系统,使用命令setenforce 0(不过这只是暂时关闭SELinux,重启后SELinux依然是开启的,所以建议前面那种一劳永逸的方法)。



注意 在grub的启动参数中增加selinux=0,也可以关闭SELinux。



2.关闭不需要的tty

先编辑/etc/inittab,找到如下一段代码:


1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6
这段代码会使init为你打开6个控制台,分别可以用ALT+F1到ALT+F6进行访问。此6个控制台默认都驻留在内存中,用“ps auxf”命令就可以看到,命令如下所示:


ps aux | grep tty | grep –v grep
命令显示结果如下所示:


root 3209 0.0 0.0  3812 480 tty1 Ss+ 16:18 0:00 /sbin/mingetty tty1

root 3210 0.0 0.0  3812 484 tty2 Ss+ 16:18 0:00 /sbin/mingetty tty2

root 3211 0.0 0.0  3812 484 tty3 Ss+ 16:18 0:00 /sbin/mingetty tty3

root 3212 0.0 0.0  3812 484 tty4 Ss+ 16:18 0:00 /sbin/mingetty tty4

root 3213 0.0 0.0  3812 480 tty5 Ss+ 16:18 0:00 /sbin/mingetty tty5

root 3214 0.0 0.0  3812 484 tty6 Ss+ 16:18 0:00 /sbin/mingetty tty6

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


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

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


echo 'net.ipv4.tcp_syncookies=1' >> /etc/sysct.conf
让此内核改动立即生效,命令如下所示:


sysctl -p
4.修改SHELL命令的history记录个数

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


vim /etc/profile
找到 HISTSIZE=1000并改为 HISTSIZE=100 (这条可根据实际情况而定)。

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


source /etc/profile
5.定时校正服务器的时间

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

yum install ntp`

编辑/etc/crontab 文件,在末尾加入一行:

01 01 * root /sbin/ntpdate ntp.api.bz >> /dev/null 2>&1
ntp.api.bz是一组NTP服务器集群,目前有6台服务器,位于上海电信处。这项服务是api.bz继sms.api.bz移动飞信免费短信发送接口之后的第二项免费API服务。

6.停止打印服务

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

/etc/rc.d/init.d/cups stop ← 停止打印服务

Stopping cups:    [OK]  ← 停止服务成功,出现“OK”

chkconfig cups off ← 禁止打印服务自动启动

chkconfig –list cups ← 确认打印服务自启动设置状态

cups0:off 1:off 2:off 3:off 4:off 5:off 6:off ← 0~6都为off的状态就可以了(当前打印服务禁止自启动)
7.调整Linux的最大文件打开数

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

* soft nofile 60000

* hard nofile 65535```
但重启后一切都还原了。

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


ulimit -SHn 65535
如果想当前Shell及重启后此项操作都生效,这两步操作都要执行。当然了,我们也可以在Nginx的一些监控脚本里实时添加此命令行,达到重启也能生效的目的。

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

!/bin/bash

for pid in 'ps aux |grep nginx |grep -v grep|awk '{print$2}''

do

cat /proc/${pid}/limits |grep 'Max open files'

done`
8.启动网卡

大家配置CentOS 5.5的网卡时,容易忽略的一项就是Linux启动时未启动网卡,其后果很明显,那就是你的Linux机器永远也没有IP地址,下面是一台线上服务器网卡文件/etc/sysconfig/network-scripts/ifcfg-eth0的配置:

# Intel Corporation 82541GI Gigabit Ethernet Controller

DEVICE=eth0

BOOTPROTO=none

HWADDR=00:14:22:1B:71:20

IPV6INIT=yes

IPV6_AUTOCONF=yes

ONBOOT=yes →此项一定要记得为yes,它会在系统引导时就启动网卡设备

NETMASK=255.255.255.192

IPADDR=203.93.236.146

GATEWAY=203.93.236.129

TYPE=Ethernet

PEERDNS=yes →允许从DHCP处获得的DNS覆盖本地的DNS

USERCTL=no~ →不允许普通用户修改网卡
9.关闭写磁盘I/O功能

Linux系统下文件默认有3个时间,如下所示:

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

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

mtime:此文件的修改时间。

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

首先,修改文件系统的配置文件,我们用打开/etc/fstab文件,然后,在包含大量小文件的分区中使用noatime和nodiratime这两个命令,命令如下所示:

/dev/sda5 /data/pics ext3 noatime,nodiratime 0 0
这样访问文件时就不会再产生写磁盘的I/O了。

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

内核的优化跟服务器的优化一样,本着稳定安全的原则。下面以64位的CentOS 5.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服务器中可输入查看当前连接统计数的命令,如下所示:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
命令显示结果如下所示:

LAST_ACK 14

SYN_RECV 348

ESTABLISHED 70

FIN_WAIT1 229

FIN_WAIT2 30

CLOSING 33

TIME_WAIT 18122
命令中的含义分别如下所示:

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

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

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

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

ESTABLISHED:正常数据传输状态。

FIN_WAIT1:应用说它已经完成。

FIN_WAIT2:另一边已同意释放。

ITMED_WAIT:等待所有分组死掉。

CLOSING:两边同时尝试关闭。

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

LAST_ACK:等待所有分组死掉。

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

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

vim /etc/sysctl.conf
然后,增加以下参数:

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000
其中:

net.ipv4.tcp_syncookies=1表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击,默认为0,表示关闭。

net.ipv4.tcp_tw_reuse=1表示开启重用。允许将TIME_WAIT socket重新用于新的TCP连接,默认为0,表示关闭。

net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME_WAIT socket的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time=1200表示当Keepalived启用时,TCP发送Keepalived消息的频度。默认是2小时,改为20分钟。

net.ipv4.ip_local_port_range=1024 65000表示向外连接的端口范围。默认值很小:32768~61000,改为1024~65000。

net.ipv4.tcp_max_syn_backlog=8192表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets=5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并输出警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,前面介绍的几个参数已经可以很好地减少TIME_WAIT套接字数量,但是对于Squid来说,效果却不大。有了此参数就可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

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

/sbin/sysctl –p
如果使用Apache或Nginx等Web服务器,则只需要更改以下几项即可:

net.ipv4.tcp_syncookies=1

net.ipv4.tcp_tw_reuse=1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 1024 65000
执行以下命令使内核配置立马生效:

/sbin/sysctl –p
如果使用Postfix邮件服务器,则建议内核方案如下:

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 300

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 5000 65000

kernel.shmmax = 134217728
执行以下命令使内核配置立马生效:

/sbin/sysctl –p

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

在本节中,我们从服务器的硬件选择、安装及内核等方面对单机服务器的性能进行了优化,不过对于网站和系统来说,单机优化对整体性能提升的作用毕竟有限,它们的优化其实是靠服务器的高可用和高扩展性来实现的,这部分内容我在后面的章节中再来说明。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接