Linux系统优化基础和系统监控


系统优化  

系统优化有其两面性,选择优化一个选项的时候,总会牺牲另一个选项的性能 

优化的几个方向:
加硬件  
架构	
(资源流动性)

linux系统优化,调优
(微调)

redhat官方文档
Red_Hat_Enterprise_Linux-7-Performance_Tuning_Guide-zh-CN.pdf

业务上线之前的优化:
1,安装系统优化
以自用环境500G硬盘为例:
/boot	300M-500M  (只存放grub和启动有关文件,不存放其它) 
/       100G-150G(因为很多人默认会把各种东西放到根目录下,没有单独挂载的分区都属于根);
swap	内存小就一般分2倍,内存大(现在的服务器16G以上内存很常见)就最大4G或8G
/var    50-100G (主要存放日志,邮件,ftp,httpd等家目录,kvm的磁盘文件等)
/vm	50-100G (主要存放vmware虚拟机)
/data	50G-100G左右 (主要存放你的个人数据)
还需要留一点空间用于以后分区用。
如果你的系统出了严重问题,能排错就排错,不能或很麻烦在重装时只格式化根分区就可以了,重装完后,改写/etc/fstab
根分区分得太小,满了怎么办?如果是lvm可以在线扩容,没用lvm只能去把根分区下的一些数据移到其它分区 (除非用新一代文件系统如btrfs这种;xfs文件可以使用xfs_growfs来扩容)
b,软件包的选择:你需要啥就安装啥(如果你非常在意系统瘦身,那么选择最小化安装,再安装应用时少啥就装啥)
c,bios(UEFI)和grub加密码增强安全性和磁盘加密



swap有两种做法(swap文件和swap分区,swap分区会更有效,建议使用swap分区)
swap文件做法如下
# dd if=/dev/zero of=/test/swapfile bs=1M count=1000
# mkswap /test/swapfile
# swapon /test/swapfile
# swapoff /test/swapfile   --不用了就swapoff(swapon的反向操作)

swap加分区做法:
先使用fdisk或parted分一个区,如/dev/sdaX
# mkswap /dev/sdaX
# swapon /dev/sdaX
最后写到fstab里


2,
a,关闭不用的服务 (service xxx stop;systemctl stop xxx 或 chkconfig xxx off;systemctl disable xxxx或 ntsysv --level 2345)
有几个服务记录不要关闭了:haldaemon,messagebus这两个服务关闭任意一个,就造成开机鼠标键盘无法用(rhel6下的经验,rhel7未测试,rhel7没有haldaemon服务了)
常见的不关闭服务:network,sshd,rsyslog,libvirtd,ntpd等
b,没有服务脚本的可以写服务脚本,或者有些服务脚本写得不好,你可以修改代码
c,服务脚本权限降权(chmod 700 -R /etc/init.d/*),或者结合sudo进行相应授权
d,没有服务脚本的进程,可以使用kill来关闭(注意kill -9和kill -15的区别)


3,静态IP,网关,dns指向
# /etc/init.d/NetworkManager stop
# chkconfig NetworkManager off
然后配置静态ip
# vim /etc/sysconfig/network-scripts/ifcfg-xxx
DEVICE=xxx
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=x.x.x.x
NETMASK=x.x.x.x
GATEWAY=x.x.x.x
DNS1=x.x.x.x
DNS2=x.x.x.x

rhel7里的nmcli命令非常强大,可以几乎控制网络相关的一切修改

4,主机名配置和绑定
问题:域名和主机名有什么区别?
域名:公网名字,花钱买,唯一
主机名:内网名字

如果公司现在有100甚至更多台机器,都要互相绑定主机名
方法一:shell脚本,先在其中一台绑定所有机器的IP与名字到/etc/hosts文件,再用shell脚本循环拷到其它所有机器(ssh等效性或expect)
方法二:在安装所有机器时,使用kickstart或cobbler,让其在安装的时候就通过postscripts实现安装完后就统一截IP,配置主机名,绑定主机名);此方法不适合主机名有改变的情况 
方法三:内网DNS(/etc/nsswitch.conf这个文件里面配置了,称查找/etc/hosts,再查找DNS)
方法四:使用自动化运维工具,如puppet,ansible,saltslack......


5,yum配置
首先要注意yum只能安装rpm包,不能安装源码包。如果觉得安装源码包麻烦,甚至可以自己把源码做成rpm包(要求水平较高)

一般不可能所有服务器都用公网的yum源。建议把本地iso和第三方下载的rpm包都在其中一台服务器做成yum仓库,其他服务器就直接使用这台的yum源就可以了

yum的路径怎么写?
答案:要写repodata的上一级目录的路径

如何下载
a),先配置远程公网yum源路径
如下
[puppet]
name=puppet
baseurl=http://yum.puppetlabs.com/el/6.5/products/x86_64/
enabled=1
gpgcheck=0

b)使用reposync命令
reposync --repoid=puppet

都会下载到本地当前目录

c)因为下载后,没有repodata目录,所以需要手动生成
yum install createrepo -y
createrepo  下载的目录路径/

d)通过服务如httpd做成其它服务器能使用的yum源


--------------------------------------------------------------------
扩展使用yum要注意的一个小例子
使用yum remove  删除软件包时,一般会删除一些依赖包,然后 yum install重新安装,不一定会把这些依赖包自动装回来。所以建议都把这些依赖包手动再安装回来


# rpm -qa |grep ^mysql		--我这里查找到已经安装了这么多mysql的软件包
mysql-devel-5.1.71-1.el6.x86_64
mysql-test-5.1.71-1.el6.x86_64
mysql-server-5.1.71-1.el6.x86_64
mysql-connector-java-5.1.17-6.el6.noarch
mysql-5.1.71-1.el6.x86_64
mysql-libs-5.1.71-1.el6.x86_64
mysql-bench-5.1.71-1.el6.x86_64
mysql-connector-odbc-5.1.5r1144-7.el6.x86_64

下面我需要重装这些软件包,在使用yum remove mysql*时删除的包包括依赖性特别的多,这样很可能会因为删除了其它服务需要使用的rpm包,而造成其它服务或系统其它的功能缺失


解决方法:
方法一:
rpm -e mysql-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-devel-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-server-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-test-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-connector-java-5.1.17-6.el6.noarch --nodeps
rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-bench-5.1.71-1.el6.x86_64 --nodeps
rpm -e mysql-connector-odbc-5.1.5r1144-7.el6.x86_64 --nodeps
再重装回来
yum install mysql* 


方法二:
rpm -qa |grep ^mysql |xargs rpm -e --nodeps
再重装回来
yum install mysql*


方法三:
直接使用yum remove mysql*  去删除包
再用下面的命令重装回来
# cat /var/log/yum.log |grep "Jun 04" |grep Erased |awk '{print $NF}' |xargs  yum install -y


--上面三个方法最好的应该是方法二,操作快速,而且不会像方法三那样去删除了其它的依赖性包(因为你删除其它的依赖性包,就算是再安装回来,那么原来的配置文件被刷新了)

6,用户有关的:
a,删除不需要使用的用户(如adm,lp,sync,shutdown等)加强安全(可选)
b,写脚本定期检查无密码账号或uid为0的账号	awk -F: '$3==0 {print $1}' /etc/passwd
c,创建要用的普通用户(如果一个用户只用于跑服务daemon,可以指定家目录为/dev/null,uid小于500,登录环境为/sbin/nologin等,如useradd -r -d /dev/null  -s /sbin/nologin xxx) 看需求修改/etc/login.defs文件。或者在登录或登出时有些特殊需要,可以修改/etc/skel/.bash_profile和/etc/skel/.bash_logout
d,做完后,保证口令文件的安全(如,不需要修改就chattr +i /etc/passwd,chattr +i /etc/shadow,chattr +i /etc/group,chattr +i /etc/gshadow)
e,对相应的普通用户做sudo授权
f,设置用户自动退出登录时间限制
   如:在/etc/profile里加入 TMOUT=300 表示5分钟不操作,会自动退出

7,按需求定制pam,iptables(firewalld)或selinux的配置


8,内核优化:内核编译优化和内核参数优化(这里讨论内核编译优化)
如果有必要,并且技术水平成熟的情况下,可以重新编译升级内核
问题:OS自带的内核非常稳定,什么情况下需要自己编译内核?
答案:内核如果不支持你所需要的一个功能,可以重编内核来加上这个功能。但是一般来说,没有内核不支持的功能,但redhat自带的内核不一定给你加上了这个功能。
比如,要在linux下支持ntfs格式挂载,方法有:
一,重编内核,加上ntfs挂载功能(因为redhat默认没有加到内核里,但内核是支持的)
二,用第三方软件,把功能做成模块加到内核上,让其支持
还有一个情况需要自己编译内核,就是内核编译优化,简单来说就是把内核里自己用不到的功能都去掉,只留下自己用得到的功能。

注意:生产环境不建议你真的去编译内核,因为你很难编译出一个稳定且正符合你所用的内核。

重编译内核或新内核的步骤:
a)下载新内核源码,解压;OS自带内核源码在(/usr/src/kernels/`uname -r`/,如果此内核源码目录不存在,可以通过yum install kernel-devel -y安装)
b)cd 内核源码目录/
c)make menuconfig
  按你需求来选择功能 
	* 代表编进内核
	M 代表编译成模块  需要modprobe  xxx装载才能使用
        空 代表不需要这个功能
d) 选择好功能后,保存,会把你所有的选择保存到一个.config文件里
e) make
f) make modules_install    --把编译后的模块复制到/lib/modules/内核新版本/  以后就可以用modprobe insmod来装载使用
g) make install
h) reboot 重启你的系统,在grub菜单选择新的内核登录你的OS



9,文件系统
ext2,ext3,ext4,fat32,ntfs,xfs,reiserfs,zfs,btrfs,jfs,nfs,gfs2,ocfs......
下面以rhel6默认ext4为例简单讨论ext4的优化
a,单个文件可以chattr +A xxx 让这个文件的atime不变化(因为atime是文件的访问时间,基本没什么实用价值,所以让其不变化,就是一种优化)
b,只优化单个文件肯定不行,所以需要优化整个文件系统让所有文件atime都不变化
 在rhel5里cat一次,atime就会变一次
 在rhel6里只有当atime时间早于或等于mtime或ctime之一时,cat这个文件,atime才会变(因为rhel6已经做了相对的优化,主要实现的方法是在mount时加了relatime)
 但我们想优化更彻底,那么让atime在任何情况下都不会变,做法为:
# mount -o defaults,noatime /dev/sda7 /test/	--这样做后,/dev/sda7这个分区里的所有文件都不变改变atime了


mount -o defaults,norelatime,strictatime /dev/sda7 /test/  --这样做是做成和rhel5一致,每cat一次文件,文件的atime都会变


所有分区都要这样做,就在/etc/fstab里把所有分区的defaults参数后加,noatime就可以了

但写到fstab里需要重启才能生效,因为根分区不能umount再mount,所以要使用下面remount的参数在线重挂载
# mount -o remount,defaults,noatime /


c,Ext4 提供三种数据日志记录方式: data=writeback 、 data=ordered  (默认) data=journal。

 data=writeback   速度最快,但不记录文件系统日志,只记录基本元数据,数据安全性低 
 data=journal     速度最慢。但记录完整文件系统日志,数据安全性高	
 data=ordered	  居中
如果要修改,在mount时用-o data=writeback来挂载就可以.或者在/etc/fstab里defaults,data=writeback就可以了

小实验:
用一个实验分区,分三种日志记录方式去挂载,然后使用dd命令写文件来测试比较速度
mount -o defaults,data=writeback /dev/sda7 /test/
cd /test
dd if=/dev/zero of=test
--最快

mount -o defaults,data=journal /dev/sda7  /test
cd /test
dd if=/dev/zero of=test
--最慢

mount -o defaults,data=ordered /dev/sda7 /test
cd /test
dd if=/dev/zero of=test
--居中


综合上面所述,你可以在/etc/fstab文件里把defaults改为defaults,noatime,data=writeback来提高文件系统速度


小实验:
使用下面命令模拟一个分区丢失superblock,相当于是文件系统出问题
# dd if=/dev/zero of=/dev/sda9 bs=1 count=1024 seek=1024

文件系统出问题,挂载就会报下面的错误
# mount  /dev/sda9 /mnt/
mount: you must specify the filesystem type


排错,不能直接重新格式化,那样的话数据全丢了.所以可以用下面的命令修复
# fsck /dev/sda9

小实验:
把你系统时间改到将来,然后把开机要挂载的分区重新挂载一下(比如boot分区或根分区这种),然后reboot重启系统

会在启动系统时启不来,会报一个"分区挂载时间在将来的错误",解决方法也是fsck接要修复的分区

=============================================================================================================


优化
横向:加新的设备,架构扩展
纵向:替换新的更好的设备,使设备负载能力更高

下面我们讨论的是不加设备也不换设备的基础上进行系统微调


前面讨论的是系统安装到业务上线之前的一些基本优化,如果业务已经在线上,你要优化,第一步如何做?


	比如一个web服务器慢,可以会有哪些问题?
思路:
	cpu->mem->io->file system->network->os参数->服务本身配置-》开发代码

首先要进行服务器数据采集,和性能监测分析
方法有
一:使用cacti,nagios,zabbix等监控工具
二:使用linux自带的一些监控指令:如vmstat,iostat,mpstat,sar等等

		硬件问题

		CPU子系统   	
		内存子系统 
		IO子系统      
		网络子系统	

		文件系统
		运行的服务等

一,
cpu(Central Processing Unit)子系统 

CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,
比如拷贝一个文件通常占用较少CPU,只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成

科学计算通常占用较多的CPU,大部分计算工作都需要在CPU上完成,内存、硬盘等子系统只做暂时的数据存储工作
要想监测和理解CPU的性能需要知道一些的操作系统的基本知识,比如:中断,进程调度,进程上下文切换,可运行队列等


cpu单核在同一个时间点只能干一件事,但单核CPU一样可以跑多任务操作系统,其实就是分CPU资源(时间片)


CPU很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),
由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作  (上下文切换),
部分工作做完以后还需要及时向老板汇报(中断),
所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。


	中断	设备通知内核,完成了一次数据处理过程。也可以理解为:cpu停止下来去执行别的指令。例如:完成一次IO。或者完成一次网络数据包的发送。
	内核处理过程 --- 控制优先级,进行任务调度。
	用户进程
	上下文切换 --- 把正在占用cpu的进程放回队列中(每次内核的上下文切换,资源被用于关闭在CPU寄存器中的线程和放置在队列中)
	运行队列



那么监测CPU性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:


  CPU利用率,如果CPU有100%利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;

  上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;


云(虚拟化)  提高资源利用率




查看cpu信息
# cat /proc/cpuinfo   --能看到指令集,CPU核数,频率,缓存等相关信息
# lscpu


要采集CPU当前正在运行的信息数据,要用到下面的命令或者监控软件(nagios,zabbix等)
top
uptime		
vmstat
mpstat --需要yum install sysstat
sar  --需要yum install sysstat



# vmstat 2  	每2秒钟采集一下数据
# vmstat 2 3 	每2秒钟采集一次,一共采集3次

# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  78112  63432 1519100    0    0   233    18 1906 1190 26 13 59  1  0
 1  0      0  78112  63432 1519100    0    0     0     0 4180 1378 33 17 50  0  0
 1  0      0  78112  63440 1519092    0    0     0    30 4284 1706 33 17 50  0  0


r	可运行队列。单核cpu,不应该超过3(经验得到的数据,只是表明大于这个值表明运行队列有点长)
b	当前被阻塞的进程,一般这些进程都是在等待某些外部资源而被阻塞。>3需要注意,而且一直出现或者经常出现,就更值得注意
in	中断数。一般代表大量设备操作成功通知内核。
cs	上下文切换。一般代表任务需要紧急被cpu处理。数字高,只能说明内核在充分发挥它的任务调度作用。不能简单通过该数字判断cpu就出现瓶颈。
us	用户进程所占用的cpu时间的百分比
sy	内核在进行任务调度所占用的cpu时间的百分比
id	cpu空闲所占用的时间百分比.仅仅0不能简单判断cpu出现瓶颈,只能说它被充分被留用。
wa	等待IO所消耗时间百分比
st	被硬件虚拟化的虚拟机所消耗掉的时间百分比






mpstat 和 vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据


# mpstat  -P ALL 1	---P ALL表示查看所有CPU核, 1表示每一秒显示一次
10:46:35 AM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
10:46:36 AM  all   26.13    0.00    6.53    0.00    3.52    9.05    0.00   54.77  19478.22
10:46:36 AM    0   25.74    0.00    6.93    0.00    2.97    7.92    0.00   56.44   9740.59
10:46:36 AM    1   26.73    0.00    6.93    0.00    3.96   10.89    0.00   51.49   9739.60



# sar -u  查看cpu相关的历史数据	--这是历史数据,是每十分钟会去采集一次系统相关的数据
# sar -u 2 3	--两秒一次,显示三次(不是历史数据,是当前动态数据)



sysstat  --> 提供 sar 命令		(system activity reporter)

sar的特点:可以对过去时间的系统状态进行分析,但不能对某个进程进行深入分析,只能对系统的整体情况进行分析。

yum install sysstat   -y		

# systemctl start sysstat 
# systemctl enable sysstat



安装systat包后,就会自动在 /var/log/sa/saxx 产生数据   xx代表日期
可以使用sar -f /var/log/sa/saxx  去访问  加参数就可以访问不同类型的性能数据

		指定查询之前的日期与固定时间点的方法


	 sar -u -f /var/log/sa/sa18	--查看这个月已经过的18号的cpu历史数据

	 sar -u -f /var/log/sa/sa18  -s 09:00:00 -e 10:00:00	--指定只看18号9点到10点的cpu历史数据



保存性能数据
sar支持保存成两种格式的文件,一种是文本文件,一种是二进制文件 (只有通过sar自己的命令 -f 参数 才能看)

保存为文本文件,可以直接cat命令查看
sar -p 1 5 > /tmp/test/sar1.txt

保存为二进制文件
sar -p  1 5  -o /tmp/test/sar2.txt 1>/dev/null    	--会显示到屏幕,可以用1>/dev/null
file /tmp/test/sar2.txt      --是data类型文件
sar -f /tmp/test/sar2.txt     --使用-f参数读取  



可以通过做实验,再来用vmstat,mpstat,sar来看cpu的变化

如:执行下面的sh /tmp/2.sh脚本,产生一百个运算的进程
[root@li ~]# cat /tmp/1.sh 
#!/bin/bash

a=1
sum=0
while true
do
	sum=$[$sum+$a]
	let a++	
done
[root@li ~]# cat /tmp/2.sh 
#!/bin/bash


for i in `seq 100`
do
	sh /tmp/1.sh &
done

=================================================================


总结:现在的架构cpu极少会成为瓶颈.就算是真的cpu成为了瓶颈,对cpu能做的优化太少了(要么就换硬件,要么通过扩展架构来分担压力,杀掉无用并且占用资源的进程)


系统管理员能改的也就只有进程优先级了


nice  优先级    能调的范围是 -20到19 	-20表示优先级最高,19最低

用户运行一个程序默认给的优先级为0


renice    对一个已经运行的进程进行nice值的调整
	renice 19  pid

[root@li ~]# vim /tmp/test.sh 

a=1

while [ $a -lt 1000000 ]
do
        let a++
done


nice 优先级高的能够优先分配资源,跑得快,花费的时间少,负载越高,效果越明显

实验
在一个负载高的情况下做效果更好,比如一个大文件的cp

第一个终端:
[root@li ~]# time sh /tmp/test.sh 

real    0m39.363s
user    0m26.338s
sys     0m0.900s

第二个终端:
[root@li ~]# time nice --19 sh /tmp/test.sh	--19 第一个是参数的横杠,第二个是负号

real    0m26.881s
user    0m26.008s
sys     0m0.871s

--对比上面的时间,可以看到 高优先级的花费的时间少


可以把上面的实验再做一次,马上用top查出-19的pid值,并使用renice修改

renice 19  9683


[root@li ~]# time sh /tmp/test.sh 

real    0m34.665s
user    0m26.277s
sys     0m0.896s

[root@li ~]# time nice --19 sh /tmp/test.sh
real    0m37.231s
user    0m26.094s
sys     0m0.905s


--从上面的时间可以看出,-19优先级的半路被改为19后,所花费的时间反而多了


注意:只有管理员才能把优先级往高调,普通用户只能调自己的,并且只能往低调,调低后还不能再调高


====================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值