您的位置:首页 > 运维架构 > Linux

学习稳固-51CTO优化Linux服务器

2019-08-04 02:05 956 查看
原文链接:http://www.cnblogs.com/birdgao/archive/2010/08/25/1808436.html

学习稳固-优化Linux服务器

一、时间同步

  vim /etc/crontab

  14 04 *** root /usr/sbin/ntpdate ntp.api.bz > /dev/null 2 >&1

  crontab命令用途就是: 提交、编辑、列出或除去cron作业/

  crontab [ -e [UserName] | -l [UserName] | -r [UserName] | -v [UserName] | File] 

 描述

这个 crontab 命令提交、编辑、列出或除去 cron 作业。一个 cron 作业是一个命令,其运行是由 cron 守护程序在规则的调度间隔执行的。要提交一个 cron 作业,指定 crontab 命令用 -e 标志。crontab 命令调用一个编辑会话,允许创建一个 crontab 文件。在这个文件中,为每个 cron 创建条目。每个条目必须是一种 cron 守护程序可接受的格式。要得到创建条目的信息,参阅 crontab 文件条目格式。
当创建完条目和退出文件后,crontab 命令将它复制到 /var/spool/cron/crontabs 目录,并把它放到一个文件中,此文件的名称是当前的用户名。如果以用户名命名的文件已存在于 crontabs 目录中,crontab 命令会覆盖它。
同样的,可以通过指定文件参数创建 crontab 文件。如果此文件已经存在,格式必须是 cron 守护程序所需要的。如果文件不存在,crontab 命令就调用编辑器。如果 EDITOR 环境变量存在,此命令就调用它指定的编辑器。否则,crontab 命令调用 vi 编辑器。
要列出 crontab 文件的内容,就指定 crontab 命令并采用 -l 标志。要除去存在的文件,采用 -r 标志。
可选的 UserName 参数可被 crontab 文件的所有者或者 root 用户来使用,为指定的用户编辑、列出、除去或验证 cron 作业的状态。如果 UserName 是无效的,就会产生错误消息并退出程序。如果可选的 UserName 参数没有被指定,这个 crontab 标志对于 root 用户和当前用户可用。
安全性
只有 root 用户和 crontab 文件的所有者可以在 -e、-l、-r 和 -v 标志后面使用 UserName 以编辑、列出、除去或验证指定用户的 crontab 文件。
cron 守护程序
这个 cron 守护程序运行的命令和 crontab 文件条目是相对应的。如果不重新定向 cron 作业的输出为标准输出或标准错误,cron 守护程序就会通过电子邮件告知您任何命令输出或错误。如果在 crontab 文件中指定了不正确的 cron 作业,这个 cron 守护程序不运行这个作业。
cron 守护程序只在 cron 守护程序被初始化时检查 crontab 文件。当用 crontab 命令改变 crontab 文件时,指示变化的消息被发送到 cron 守护程序。这消除了在规则的调度间隔检查新的或改变的文件的开销。
控制使用 crontab 命令
/var/adm/cron/cron.allow 和 /var/adm/cron/cron.deny 文件控制哪一个用户可以使用 crontab 命令。root 用户可以创建、编辑或删除这些文件。这些文件中的条目是用户登录名,每行一个名称。如果登录标识和多个的登录名称相关联,这个 crontab 命令采用第一个在 /etc/passwd 文件中的登录名称,而不管当前实际使用哪一个登录名称。而且,要允许用户启动 cron 作业,应该使用 chuser 命令将 /etc/security/user 文件中的守护程序属性设置为 TRUE。
以下关于 cron.allow 文件的一个示例: 
root nick dee sarah
如果 cron.allow 文件存在,只有在文件中出现其登录名称的用户可以使用 crontab 命令。root 用户的登录名必须出现在 cron.allow 文件中,如果这个文件存在的话。系统管理员可以明确的停止一个用户,通过使用 crontab 命令,同时在 cron.deny 文件中列出用户的登录名。如果只有 cron.deny 文件存在,任一名称没有出现在这个文件中的用户可以使用 crontab 命令。
如果以下一个条件成立,用户将不能使用 crontab 命令:
cron.allow 文件和 cron.deny 文件不存在(只允许 root 用户)。  
cron.allow 文件存在,但用户的登录名并不列在其中。  
cron.deny 文件存在,并且用户的登录名列在其中。 
如果 cron.allow 和 cron.deny 文件都不存在,只有被 root 用户授权的人可以用 crontab 命令提交一个作业。
crontab 文件条目格式
一个 crontab 文件包含每个 cron 作业的条目。条目由换行字符分开。每个 crontab 文件条目包括 6 个字段,它们被空格或制表符以以下格式分开:
minute  hour  day_of_month  month  weekday  command 
这些字段接收以下值:
minute 0 到 59 
hour 0 到 23 
day_of_month 1 到 31 
month 1 到 12 
weekday 0 到 6 (星期日到星期六) 
command shell 命令 
必须为每个字段指定一个值。除了 command 字段,这些字段可以包含以下内容:指定范围内的一个数。要在 5 月运行一个命令,在 month 字段指定 5 。  
两个被破折号分开的数目表明了包含的范围。要从星期二到星期五运行 cron 作业,把 2-5 放到 weekday 字段中。  由逗号隔开的数字列表。要在一月第一天和最后一天的运行命令,在 day_of_month 字段中可指定 1,31。  
*(星号),意味着所有的允许值。要每个小时运行一个作业,在小时字段指定一个星号。 
注: 任一字符前如有一个反斜杠符号(包括 %)会引起字符被字面上的处理。天的规范是由两个字段(月的天和星期的天)组成的。如果指定两者都为元素的一个列表,这两个字段均被包含在其中。例如,如下条目: 
0 0 1,15 * 1 command
将在每个月的第一天和第十五天运行 command,还有每个星期一。要仅在一个字段中指定天,另一字段应包含 * 。
指定命令
这个 cron 守护程序运行命名于所选日期和时间的第六个字段中的字段。如果包含一个 % (百分号)在第六字段,cron 守护程序像命令调用一样处理所有的任务,并使所有的后续任务在标准输入上可用,除非转义百分号 (\%)。空行和第一个非空字符是编号标记(#)将被忽略。如果命令含有反斜杠 (\) 的参数,反斜杠前应加另一个反斜杠。
:shell 只运行该命令字段的第一行。所有其他的行作为标准的输入对于命令可用。
cron 守护程序从 HOME 目录中启动一个子 shell。如果调度一个命令运行,这时您尚未登录,并且希望在 .profile 文件中的命令运行,这个命令必须明确的读取您的 .profile 文件。
cron 守护程序为每个 shell 提供了一个缺省的环境,定义了 HOME, LOGNAME, SHELL (=/usr/bin/sh) 和 PATH (=/usr/bin)。
标志
-e UserName 编辑用户的 crontab 文件的副本,或者,如果一个有效的 UserName 的 crontab 文件不存在则创建一个空的文件进行编辑。当编辑完成后,文件被到 crontab 目录作为用户的 crontab 文件。 
-l UserName 列出用户的 crontab 文件。 
-r UserName 从 crontab 目录除去用户的 crontab 文件。 
-v UserName 列出用户 cron 作业的状态。 
安全性
审计事件:如果审计子系统已经被正确的配置和启用,crontab 守护程序就会当每次执行命令时产生以下审计记录(或事件):
事件 信息 
CRON_JobRemove 列出哪一个用户除去了 cron 作业和除去的时间。 
CRON_JobAdd 列出哪一个用户添加了 cron 作业和添加的时间。 
有关如何正确选择和分组审计事件以及如何配置审计事件数据收集的更详细信息,请参阅 《安全性》 中的 Setting up Auditing。
退出状态
该命令返回以下退出值:
0 成功完成。 
>0 发生错误。 
示例
要将名为 mycronjobs 的文件复制到 /var/spool/cron/crontabs 目录中,输入以下内容:  
crontab mycronjobs 
文件将复制为:  
/var/spool/cron/crontabs/ 
其中 是您当前的用户名。  
要每小时将时间写入控制台(以小时的形式),请输入:  
0 * * * * echo The hour is `date` 。>/dev/console 
要在每个星期一、星期三和星期五的 6:30 a.m. 运行 calendar 命令,请输入:  
30 6 * * 1,3,5 /usr/bin/calendar 
要在一年中每天 6:30 运行 calendar 命令,请输入:  
30 6 * * * /usr/bin/calendar 
要在八月每天午夜运行名为 maintenance 的脚本,请输入:  
0 0 * 8 * /u/harry/bin/maintenance 
为命令的标准输入定义文本,请输入:  
0 16 * 12 5 /usr/sbin/wall%HAPPY HOLIDAY!%Remember to  turn in your time card. 
在% (百分号)之后定义 wall 命令的标准输入的文本:  
HAPPY HOLIDAY!   Remember to turn in your time card.
文件
/var/adm/cron/FIFO 指定的管道,当用 crontab 或 at 命令提交新作业时,它将消息发送到 cron 守护程序。 
/var/spool/cron/crontabs 指定 crontab 缓冲池区域。 
/var/adm/cron/cron.allow 指定用户列表,这些用户被允许访问 crontab 命令。 
/var/adm/cron/cron.deny 指定用户列表,这些用户不被允许访问 crontab 命令。

二、启用内核中的SYN cookie保护

  echo "1"  > /proc/sys/net/ipv4/tcp_syncookies

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

  /sbin/sysctl -p

 

  SYN 攻击原理以及防范技术 

   据统计,在所有黑客攻击事件中,SYN攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SYN攻击造成更大的破坏。本文介绍SYN攻击的基本原理、工具及检测方法,并全面探讨SYN攻击防范技术。

据统计,在所有黑客攻击事件中,SYN攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SYN攻击造成更大的破坏。本文介绍SYN攻击的基本原理、工具及检测方法,并全面探讨SYN攻击防范技术。一、TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 
Backlog参数:表示未连接队列的最大容纳数目。SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。二、SYN攻击原理SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn=j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。三、SYN攻击工具SYN攻击实现起来非常的简单,互联网上有大量现成的SYN攻击工具。1、windows系统下的SYN工具以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,windows系统开放tcp139端囗,UNIX系统开放tcp7、21、23等端囗。四、检测SYN攻击检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们使用系统自带的netstat 工具来检测SYN攻击:

# netstat -n -p TCP 
tcp 0  0 10.11.11.11:23124.173.152.8:25882  SYN_RECV -
tcp 0  0 10.11.11.11:23236.15.133.204:2577  SYN_RECV -
tcp 0  0 10.11.11.11:23127.160.6.129:51748  SYN_RECV -
tcp 0  0 10.11.11.11:23222.220.13.25:47393  SYN_RECV -
tcp 0  0 10.11.11.11:23212.200.204.182:60427 SYN_RECV -
tcp 0  0 10.11.11.11:23232.115.18.38:278 SYN_RECV -
tcp 0  0 10.11.11.11:23239.116.95.96:5122SYN_RECV -
tcp 0  0 10.11.11.11:23236.219.139.207:49162 SYN_RECV -
...

上面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的,表明这是一种带有IP欺骗的SYN攻击。我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:#netstat -n -p TCP   grep SYN_RECV   grep :22   wc -l 324显示TCP端囗22的未连接数有324个,虽然还远达不到系统极限,但应该引起管理员的注意。五、SYN攻击防范技术关于SYN攻击防范技术,人们研究得比较早。归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。1、过滤网关防护这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。■网关超时设置:防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。当客户端发送完SYN包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。■SYN网关:SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。■SYN代理:当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。2、加固tcp/ip协议栈防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。■SynAttackProtect机制为防范SYN攻击,win2000系统的tcp/ip协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。SynAttackProtect机制是通过关闭某些socket选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范SYN攻击的目的。默认情况下,Win2000操作系统并不支持SynAttackProtect保护机制,需要在注册表以下位置增加SynAttackProtect键值:HKLMSYSTEMCurrentControlSetServicesTcpipParameters当SynAttackProtect值(如无特别说明,本文提到的注册表键值都为十六进制)为0或不设置时,系统不受SynAttackProtect保护。当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(route cache entry)防范SYN攻击。当SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、window size和可滑动窗囗将被禁止。我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整tcp/ip协议栈。那么系统是如何检测SYN攻击发生的呢?事实上,系统根据TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。TcpMaxHalfOpen 表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。Win2000 server默认值为100,Win2000 Advanced server为500。TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动SynAttackProtect机制。Win2000 server默认值为80,Win2000 Advanced server为400。TcpMaxPortsExhausted 是指系统拒绝的SYN请求包的数量,默认是5。如果想调整以上参数的默认值,可以在注册表里修改(位置与SynAttackProtect相同)■ SYN cookies技术我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYN cookies技术被设计出来。SYN cookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYNcookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。在TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端, 如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)。在RedHat linux中,启用SYN cookies是通过在启动环境中设置以下命令来完成:# echo 1 ?? /proc/sys/net/ipv4/tcp_syncookies■ 增加最大半连接数大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。当然backlog队列需要占用大量的内存资源,不能被无限的扩大。WIN2000:除了上面介绍的TcpMaxHalfOpen, TcpMaxHalfOpenRetried参数外,WIN2000操作系统可以通过设置动态backlog(dynamic backlog)来增大系统所能容纳的最大半连接数,配置动态backlog由AFD.SYS驱动完成,AFD.SYS是一种内核级的驱动,用于支持基于window socket的应用程序,比如ftp、telnet等。AFD.SYS在注册表的位置: 
HKLMSystemCurrentControlSetServicesAFDParametersEnableDynamicBacklog值为1时,表示启用动态backlog,可以修改最大半连接数。 MinimumDynamicBacklog表示半连接队列为单个TCP端囗分配的最小空闲连接数,当该TCP端囗在backlog队列的空闲连接小于此临界值时,系统为此端囗自动启用扩展的空闲连接(DynamicBacklogGrowthDelta),Microsoft推荐该值为20。MaximumDynamicBacklog是当前活动的半连接和空闲连接的和,当此和超过某个临界值时,系统拒绝SYN包,Microsoft推荐MaximumDynamicBacklog值不得超过2000。DynamicBacklogGrowthDelta值是指扩展的空闲连接数,此连接数并不计算在MaximumDynamicBacklog内,当半连接队列为某个TCP端囗分配的空闲连接小于MinimumDynamicBacklog时,系统自动分配DynamicBacklogGrowthDelta所定义的空闲连接空间,以使该TCP端囗能处理更多的半连接。Microsoft推荐该值为10。LINUX:Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。在Redhat 7.3中,该变量的值默认为256,这个值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。我们可以通过以下命令修改此变量的值:# sysctl -w net.ipv4.tcp_max_syn_backlog=`2048`Sun Solaris Sun Solaris用变量tcp_conn_req_max_q0来定义最大半连接数,在Sun Solaris 8中,该值默认为1024,可以通过add命令改变这个值:# ndd -set /dev/tcp tcp_conn_req_max_q0 2048HP-UX:HP-UX用变量tcp_syn_rcvd_max来定义最大半连接数,在HP-UX 11.00中,该值默认为500,可以通过ndd命令改变默认值:#ndd -set /dev/tcp tcp_syn_rcvd_max 2048■缩短超时时间上文提到,通过增大backlog队列能防范SYN攻击;另外减少超时时间也使系统能处理更多的SYN请求。我们知道,timeout超时时间,也即半连接存活时间,是系统所有重传次数等待的超时时间总和,这个值越大,半连接数占用backlog队列的时间就越长,系统能处理的SYN请求就越少。为缩短超时时间,可以通过缩短重传超时时间(一般是第一次重传超时时间)和减少重传次数来实现。Win2000第一次重传之前等待时间默认为3秒,为改变此默认值,可以通过修改网络接囗在注册表里的TcpInitialRtt注册值来完成。重传次数由TcpMaxConnectResponseRetransmissions 来定义,注册表的位置是:HKLMSYSTEMCurrentControlSetServicesTcpipParameters registry key。当然我们也可以把重传次数设置为0次,这样服务器如果在3秒内还未收到ack确认包就自动从backlog队列中删除该连接条目。LINUX:Redhat使用变量tcp_synack_retries定义重传次数,其默认值是5次,总超时时间需要3分钟。Sun Solaris Solaris 默认的重传次数是3次,总超时时间为3分钟,可以通过ndd命令修改这些默认值。

 

三、Squid服务 

 如果自己的生产服务器是squid缓存服务器,当发现系统变慢或打开网页变慢时可输入下列命令:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'这条命令可以把当前系统的网络连接状态分类汇总,由此分析出系统变慢的原因。

 Linux下高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。

vim /etc/sysctl.conf增加以下几行:

  1. net.ipv4.tcp_fin_timeout = 30 
  2. net.ipv4.tcp_keepalive_time = 1200 
  3. net.ipv4.tcp_tw_reuse = 1 
  4. net.ipv4.tcp_tw_recycle = 1 
  5. net.ipv4.ip_local_port_range = 1024 65000 
  6. net.ipv4.tcp_max_syn_backlog = 8192 
  7. net.ipv4.tcp_max_tw_buckets = 5000 
  8.  
说明:net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小,改为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

四、Nginx服务器的情况如果服务器是Nginx负载均衡器或用于Nginx+PHP5的web服务器,此二项也必须打开:

  1. net.ipv4.tcp_tw_reuse = 1 #允许将TIME-WAIT sockets重新用于新的TCP连接  
  2. net.ipv4.tcp_tw_recycle = 1 #开启TCP连接中TIME-WAIT sockets的快速回收  
  3.  
执行以下命令使内核配置立马生效:/sbin/sysctl -p

 五、调整Linux的最大文件打开数Linux最大文件打开数的默认值很低,必须修改的高一些,否则squid服务器在高负载时执行性能将很低。vim /etc/security/limit.conf ,在最后一行添加

  1. * soft nofile 60000  
  2. * hard nofile 65535  
  3.  
值得注意的是,通过命令ulimit -SHn是改变不了linux系统的最大文件打开数的,写进/etc/rc.d/rc.local也是不行的。

 

CentOS ulimit系统命令修改

 在向大家详细介绍CentOS ulimit之前,首先让大家了解下CentOS ulimit,然后全面介绍CentOS ulimit,希望对大家有用。CentOS ulimit值(Linux文件句柄数量)在CentOS5(RHEL5)中的调整。

在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可能打不开网页.
其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量.查看方法
我们可以用CentOS ulimit -a来查看所有限制值
[root@centos5 ~]# Centos ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 4096
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited||<其中 "open files (-n) 1024 "是Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响MySQL的并发连接数目).这个值可用CentOS ulimit命令来修改,但CentOS ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效.
系统总限制是在这里,/proc/sys/fs/file-max.可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量
查找文件句柄问题的时候,还有一个很实用的程序lsof.可以很方便看到某个进程开了那些句柄.也可以看到某个文件/目录被什么进程占用了.修改方法
若要令修改CentOS ulimits的数值永久生效,则必须修改配置文档,可以给CentOS ulimit修改命令放入/etc/profile里面,这个方法实在是不方便,还有一个方法是修改/etc/sysctl.conf .我修改了,测试过,但对用户的CentOS ulimits -a 是不会改变的。只是/proc/sys/fs/file-max的值变了.(我给命令放到rc.local中失败)我认为正确的做法,应该是修改/etc/security/limits.conf
里面有很详细的注释,比如
* soft nofile 32768
* hard nofile 65536
也可以直接运行下面这个shell。直接copy到你的终端中运行就好了.
echo -ne "
* soft nofile 65536
* hard nofile 65536
" >>/etc/security/limits.conf就可以将文件句柄限制统一改成软32768,硬65536.配置文件最前面的是指domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制注意.这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning.其实CentOS ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软默认显示的是软限制,如果运行CentOS ulimit命令修改的时候没有加上的话,就是两个参数一起改变.生效
修改完重新登录就可以见到.(我的系统是CentOS5.1.修改了,重新登录后就立刻生效.可以用CentOS ulimit -a 查看确认.)
如果你使用squid的话,你要在/etc/init.d/squid的文件加入CentOS ulimit -HSn 65535.另外,在squid.conf中也要加入max_filedesc 16384

 六、只开启必须的服务

只开启必须的服务,其它均可关闭。以下列出的服务可开启:
◆crond
◆irqbalance
◆microcode_ctl
◆network
◆random
◆sshd
◆syslog
◆iptablesiptables这个待定。如果前端有硬件防火墙;这个也可以关闭,反之不行。下面的命令可检查运行在5级别的服务,3级以此类推chkconfig -- list | awk '{print $1 "\t" $7}' | grep 5:on检查下打印服务,此服务经常成漏网之鱼,关掉它。service cups stopchkconfig cups offchkconfig这条命令会关掉3和5级别的服务。

 八、开启RHEL的网卡激活模式如果服务器的系统是RHEL,就需要开启RHEL默认的网卡激活模式为ONBOOT。感觉这也算是RHEL的一个小bug吧:笔者替客户维护的某台RHEL应用服务器,居然六块网卡,在ONBOOT关闭的时候,有的启动,有的不启动,汗噢。我还特的向客户咨询了这个问题,客户答曰:买多了……vim /etc/sysconfig/network-scripts/ifcfg-eth0,eth1eth1为第二网卡,其它依此内推。ONBOOT=YES然后重启网络服务生效service network restart九、Linux内存管理Linux内存管理模式跟windows不一样,它的原则是有多少就用多少。很多Linux新手喜欢用命令free -m观察,发现free所剩无余后想办法去优化内存;其实就走进了一个误区,linux本身的内存模式就很好了,为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。所以,建议,内存管理这块顺其自然吧。

 

 

 

 

转载于:https://www.cnblogs.com/birdgao/archive/2010/08/25/1808436.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: