安装考量

理想情况下,针对特定性能目标的系统优化应该从系统设计和安装阶段开始。朝着特定的负载模式合理安装和剪裁系统可以为以后的优化节省大量的时间。

安装

在理想的世界中,对某一给定系统的优化应该在非常早就开始,系统已经根据应用需要和预期负载精心剪裁。虽然在出现瓶颈的时候管理员必须去做优化,但是我们还是应该注意在初始化安装操作系统时候的优化可能。

在开始安装系统之前,应该确定如下几个问题:

  • 选择处理器技术

  • 选择磁盘技术

  • 应用

然而,这些内容超出了本书范围。

理想情况下,应该在开始安装前应该回答如下问题:

  • 使用什么版本的Linux? 在确定业务和应用需求之后,决定使用什么版本的Linux。企业往往有规定,只能使特定的Linux,在这种情况下,出于财务和规定的原因,会决定能够使用什么系统。但是如果你有完全的选择自由,你可以考虑如下的几个问题:

    • 选择受商业支持的Linux还是定制的发行版

    在科学研究领域中,可以选择不受支持的Linux,比如Fedora。对于企业来说,我们强烈推荐受到商业支持的发行版,例如Red Hat Enterprise Linux或者Novell SUSE Enterprise Linux。

    • 商业发行版的什么版本?

    不同的商业Linux发行版在内核版本、支持的软件包或者特性,以及最重要的硬件支持上都有区别。在安装之前,先仔细检查支持的硬件配置,避免浪费硬件能力。

  • 选择正确的内核 下表中列出了企业Linux发行版提供的几个内核包。由于性能原因,确保选择为你的系统选择最合适的内核。然而,在大多数情况下这都是由安装规范决定的。请注意,在不同发行版中内核包名字的区别。

内核类型 描述
标准版 单处理器机器
SMP 内核支持SMP和超线程机器。某些还同时支持NUMA结构。可能有一些变种,取决于内存和CPU个数,等等
Xen 包含一个运行在Xen虚拟机的内核版本
许多最新内核有一种叫做SMP选择的能力,在启动时优化自己。具体参考详细的发行说明。
  • 选择什么样的分区布局?
    通常人们都是根据应用需求、系统管理、个人偏好等选择规划磁盘分区,而不是性能。多数情况下,磁盘分区规划都是规定好的。唯一的建议是,为应该分出一个swap分区来。swap分区和swap文件相比,减少了swap文件带来的文件系统消耗。交换分区很简单,在必要的时候,可以使用额外的交换分区和交换文件进行扩展。

  • 选择什么文件系统?
    不同文件系统在数据完整性和性能上有不同的表现。某些文件系统可能不受到其它发行版或者要运行的程序支持。对大多数服务器来说,默认推荐安装的文件系统会提供足够的性能。如果你对最小延时或者最大吞吐量有特别的要求,还是推荐你根据需要选择不一样的文件系统。

  • 包选择:最小化,还是所有软件包?
    在安装Linux的时候,管理员会面临是最小化安装还是要安装所有软件包的选择。有些人倾向于安装所有包,这样就会解决许多包依赖问题。

考虑到如下的问题:在安装所有包的系统上可能产生更多安全问题。在生产环境安装所有开发工具显然也更可能导致的安全问题。越少安装软件,磁盘可用空间越多。包安装管理器会帮我们解决软件依赖问题,例如红帽公司的包管理器rpm和yum。我们推荐你选择安装少的软件包,只针对特别的应用选择必须的软件包。

  • 防火墙配置
    是否开启防火墙也是需要考虑的问题。防火墙的作用是保护系统免受恶意攻击,然而,在大数据流的情况下,太多复杂的防火墙规则会降低性能。

  • SELinux
    在某些Linux发行版,例如RHEL(RedHat Enterprise Linux,红帽企业版Linux)4.0中,安装向导会让你选择安装SELinux。SELinux会带来显著的性能消耗,你应该谨慎的评估,SELinux提供的安全保护是否真的有必要。

  • 运行级别
    最后一项是选择系统的默认运行级别。除非你的应用需要你的系统运行在级别5(用户图形模式),我们强烈推荐在所有服务器系统上使用3级别来运行。通常,在数据中心里的服务器上运行GUI是毫无必要的,而且会损耗性能。如果安装向导没有提供运行级别选项,我们建议你在系统初始化完成之后手动选择级别3。

检查当前配置

如介绍中所说,在优化之前全面了解系统十分重要。全面了解指的是确保所有的子系统按照设计的方式工作,并且没有异常。异常指的是,比如一个GB网卡的服务器出现网络性能瓶颈的情况。如果网卡自动协商为100MB半双工,即使调优Linux内核的TCP/IP实现也没用。

dmesg

dmesg的作用是显示内核信息。dmesg会提供硬件问题或者内核加载的问题信息。

还有,使用dmesg,你可以确定在服务器上安装什么硬件。在启动的时候,Linux会检查硬件,并且记录相关信息。可以使用/bin/dmesg命令查看这些日志。

dmesg部分输出1

dmesg部分输出2

dmesg部分输出3

ulimit

这个命令是bash内建的,用来控制shell和由它启动的进程的可用资源,等等之类。

使用-a选项列出所有可以设置的参数:

ulimit输出

-S和-H用来设置特定资源的软硬限制。如果到达软限制,系统管理员会收到一个警告。硬限制是在用户收到”Out of file handles“错误消息之前达到的最大值。

例如,可以设置打开最大文件数(-n)的硬限制:

  1. ulimit -Hn 4096

打开最大文件数的软限制:

  1. ulimit -Sn 1024

查看软硬限制的值:

  1. ulimit -Hn
  2. ulimit -Sn

可以使用如下的命令限制Oracle用户资源,开机生效的办法,在文件/etc/security/limits.conf输入如下行:

  1. soft nofile 4096
  2. hard nofile 10240

此外,确保默认的pam配置文件(RHEL中是/etc/pam.d/system-auth,SUSE中是/etc/pam.d/common-session)有如下一行:

  1. session required pam_limits.so

有了这一行,系统才能做上面的资源限制

查看完整的ulimit语法:

  1. ulimit -?

最小化资源使用

为了发挥系统最好的性能,必须把资源浪费降到最低。为了获得更的快速度,赛车不会和普通汽车一样舒服,因为舒服的座椅也会浪费资源。同样的道理也适用于服务器系统。运行GUI和不必要的守护进程都是在降低整体性能。本部分内容是关于如何优化系统资源。

Daemons

在按照默认规则安装系统之后,可能会有几个不需要的服务和守护进程在运行。禁用掉用不到的守护进程,降低整体系统的内存占用、运行进程数以及上下文切换,更重要的是,降低暴露安全问题的风险,禁用掉不必要的守护进程还能提升系统启动速度。

默认情况下,某些系统中,有些已经启动的守护进程可以安全的停止并禁用。下表中列出了在各个发行版启动的守护进程。如果合适的话,你应该考虑把它们禁用。在各个系统上运行的进程数量可能是不一样的。关于这些守护进程的详细解释,参考system-config-services

守护进程 描述
apmd 高级电源管理守护进程,服务器上通常不用。
arptables_jf arp表网络过滤器的用户空间程序。除非需要使用atp表,否则你可以安全的禁用这个进程
autofs 根据需要自动挂载文件系统(例如,自动挂载CD-ROM)。服务器上,通常不需要自动挂载文件系统
cpuspeed 自动调整CPU频率。在服务器环境,建议关闭
cups 通用UNIX打印系统。如果计划提供打印服务,不要禁用这个服务
gpm 文本console的鼠标服务。如果需要在本地console环境使用鼠标,不要禁用。
hpoj 惠普印表机支持。如果要在服务器上使用惠普印表机就不要禁用它
irqbalance 平衡多个处理器之间的中断,如果只有一个CPU,或者你希望静态的平衡IRQ,禁用掉它
isdn ISDN调制解调器支持。如果在服务器上使用拨号就不要禁用它
kudzu 检测和配置新硬件, 在硬件变更时手动运行
netfs 用来支持NFS网络共享,如果要支持NFS,不要关闭它
pcmcia PCMCIA支持。很少有服务器系统用到PCMCIA适配器,基本上都应该禁用
portmap RPC服务(NIS和NFS)的动态端口分配。如果系统不提供基于RPC的服务,没必要启动|
rawdevices raw设备绑定支持。如果不打算使用raw设备,关闭它|
rpc* 各类远程过程调用守护进程,主要是NFS和Samba。如果系统不支基于RPC的服务,没必要开启
sendmail 邮件传输代理。如果要提供邮件服务,不要关掉它
smartd 自我监控和报告守护进程。监控S.M.A.R.T兼容设备的错误
xfs X Windows的前端服务。如果系统要运行在runlevel 5,不要禁用它
注意:关闭xfs守护进程会阻止服务器运行X程序。只能在不使用GUI的服务器上禁用。在使用startx的命令开启桌面之前,确保xfs已经启动。

在SUSE和RHEL中,/sbin/chkconfig命令可以方便的管理各类守护进程的开机启动选项。在使用chkconfig之前,首先要使用如下的命令检查运行的守护进程。

  1. /sbin/chkconfig --list | grep on

如果你希望在下次启动系统的时候不要运行某个守护进程,使用root运行下面的命令。下面的命令的结果是等价的,区别是第二条命令在所有的运行级别禁用了守护进程,使用—level可以指定具体的运行级别。

  1. /sbin/chkconfig --levels 2345 sendmail off
  2. /sbin/chkconfig sendmail off
小贴士:为了避免把宝贵时间浪费在等待完成重启的过程,只需把run level分别设置为 1、3或者5。

还有另外一个有用的系统命令,/sbin/service,管理员可以用来直接修改已注册服务的状态。第一步,管理员应该要确定服务的当前状态(以sendmail为例),命令如下:

  1. /sbin/service sendmail status

关闭sendmail的命令:

  1. /sbin/service sendmail stop

service命令十分有用,可以用来验证守护进程是否必要。使用chkconfig做出的修改只会在修改启动级别和重启的时候才会生效。然而,通过service禁用的守护进程在重启之后又会重新启动。如果你的发行版中没有service命令,你可以通过init.d目录对停止或启动守护进程。检查cups的命令如下:

  1. /etc/init.d/cups status

也可以使用基于GUI的程序修改守护进程启动,如下图。在RHEL的GUI中,点击 主菜单->系统设置->服务器设置->服务,或者使用如下的命令:

  1. /usr/bin/redhat-config-services

红帽服务配置接口

SUSE系统也通过YaST提供了同样的功能。在YaST中,服务配置在System->System Services(Runlevel)中。进入到服务配置中,推荐你使用专家模式,可以精确的设置各个守护进程状态。在runlevel 3中YaST的样子如下图:

YaST的系统服务面板

在上面的图中,开启了专家模式,就可以设置服务基于各个运行级别来开启或者关闭。

修改runlevels

无论何时,不要在Linux服务器上运行GUI图形桌面。正如所有Linux管理员向你愉快保证的那样,GUI在Linux上完全没有必要。所有的任务都可以通过命令行轻松高效的完成,或者通过重定向X显示,或者通过浏览器。如果你离不开图形窗口,有几个有用的基于web的工具可以尝试,例如webmin,Linuxconf和SWAT。

小贴士:即使服务器本地禁用了GUI,你还是可以通过远程连接使用GUI。在ssh中使用-X参数。

如果必须要使用GUI,根据需要开启或者关闭,而不是让它一直运行。大多数情况下,服务器应该运行在3级别,机器开机时不会启动X服务。如果想重启X服务,从命令行使用startx。

  • 使用runlevel查看系统的运行级别

    会显示出之前和当前的运行级别。例如,N 5意思是没有之前运行级别(N),当前运行级别是5。

  • 使用init命令在各个运行级别中切换,例如,使用init 3进入运行级别3。

Linux的运行级别如下:

0 停止(不要把initdefault设置为这个级别,否则系统启动之后会立刻关机)

1 单用户模式

2 多用户,无NFS(和没有网络的3级别一样)

3 全功能多用户模式

4 未使用,保留

5 X11

6 重启(也不要把initdefault设置为这个级别,机器会在启动的时候不断持续的重启)

设置系统启动初始运行级别的办法是,修改/etc/inittab文件,如下行:

  1. id:3:initdefault:

修改inittab

限制本地终端

默认情况下,系统有好几个本地虚拟终端。虽然虚拟终端所使用的内存是可以忽略不计的;但是我们锱铢必较。减少运行的进程数量可以简化排错过程和进程分析,这就是为什么把本地终端限制到2。

做法是注释掉不要的tty行。如上图所示,本地终端数量限制为2。如果你正在使用的shell被杀死了,你还有一个备用的终端。

SELinux

RHEL4引进了一项重要的安全措施,SELinux(Security Enhanced Linux)。SELinux引入的强制策略模型解决了标准的Linux访问模型的局限性。SELinux在用户和进程级别增强安全,所以,如果任何进程出现问题,只会影响到分配给该进程的资源,而不会是整个系统。SELinux的工作很像虚拟机。例如,如果恶意攻击者利用了apache的提权漏洞,只有分配给Apache守护进程的资源可以被攻击者利用。

selinux概览

当然,使用这种强制安全策略也有代价,任何进程或者用户在访问系统资源(例如I/O设备)的时候 都受到SELinux的控制。确认权限许可的过程可能会导致10%的损耗。在对外服务器上使用SELinux是很有必要的,例如防火墙或者Web服务器,但是在后端的数据库服务器上使用SELinux可能就会白白的损失性能而已。

通常,禁用SELinux最好的办法就是在最开始就不要安装它。但是,系统一般都是已经默认安装好了,而且没有考虑到SELinux会影响到性能。在GRUB boot loader的当前运行内核行中添加selinux=0就可以禁用掉已经安装的SELinux,如下图。

在grub.conf文件中禁用selinux的样例

另一个禁用SELinux的办法是修改SELinux的配置文件/etc/selinux/config,修改过后的该文件如下图:

使用config文件禁用selinux

如果你决定在你的服务器上使用SELinux,它的设置可以帮你更好的适应你的系统环境。在运行中的服务器,检查工作集的LSM(Linux Security Modules,Linux安全模块)缓存是否超过了默认AVC(Access Vector Cache,访问向量缓存)的512项。

在/selinux/avc/hash_stats中检查最大的链长度,任何超过10的都可能是瓶颈。

提示:你也可以使用avcstat工具来检查访问向量缓存的使用统计。

编译内核

创建和编译自己的内核对提升性能的作用其实没有人们所认为的那么大。现代大多数发行版所携带的内核都已经模块化—- 只加载需要的部分。重新编译内核可以降低内核的大小,改变整体的行为。修改源代码中的某些内核参数或许也可以节省一些性能。然而,非标准的内核不受商业Linux发行版的订阅支持。此外,为商业Linux发行版提供的ISV应用和IBM硬件认证,在检测到非标准内核的时候也会无效。

可以通过定制内核改善性能,但是,在企业环境中运行不受支持的内核也面临这很大的挑战。在商业环境确实如此,如果是科学计算领域,在要承受高性能计算任务的场景下,定制内核可能是很有帮助的。

在编译内核的时候不要指定-C09这类特殊编译器标志。Linux内核源代码已经是针对GNU的C编译器优化过的。使用特殊的编译器标志,最好的情况是降低内核性能,最差的情况下可能会破坏代码。

保持警惕,除非你真的知道自己在做什么,否则你添加的参数可能是在降低系统性能。

原文: https://lihz1990.gitbooks.io/transoflptg/content/04.系统调优/4.2.安装考量.html