文章目录
一、文件存储基础
1.1 文件与硬盘存储单位
文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。
1.2 文件数据与元信息
文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。因此,一个文件必须占用一个inode,并且至少占用一个block。inode不包含文件名,文件名是存放在目录当中的。Linux系统中一切皆文件,因此目录也是一种文件。
1.3 inode机制
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。
查看文件名对应的inode号码有两种方式:
ls -i 文件名
stat 文件名
1.4 inode与硬盘空间
inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode的大小,一般是128字节或256字节。通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数。inode的总数在格式化时就给定了,执行"df -i"命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量。
1.5 特有现象
由于inode号码与文件名分离,导致Linux系统具备以下几种特有的现象:
- 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用。
- 移动文件或重命名文件,只是改变文件名,不影响inode号码。
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
- 文件数据被修改保存后,会生成一个新的inode号码。
示例命令:
find ./ -inum 52305140 -exec rm -i {} \;
find ./ -inum 50464299 -delete
二、inode节点耗尽故障处理
2.1 模拟inode节点耗尽故障
- 使用fdisk创建分区/dev/sdb1,分区大小30M即可
fdisk /dev/sdb
mkfs.ext3 /dev/sdb1
mkdir /test
mount /dev/sdb1 /test
df -i
- 模拟inode节点耗尽故障
for ((i=1; i<=5680; i++)); do touch /test/file$i; done 或 i=i+1 或 i+=1
touch {1..5680}.txt
df -i
df -hT
- 删除文件恢复
rm -rf /test/*
df -i
df -hT
三、恢复误删除的文件
3.1 恢复误删除的ext3文件
EXT类型文件恢复
extundelete是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统(ext4只能在CentOS6版本恢复)。
- 使用fdisk创建分区/dev/sdc1,格式化ext3文件系统
fdisk /dev/sdc
partprobe /dev/sdc
mkfs.ext3 /dev/sdc1
mkdir /test
mount /dev/sdc1/test
df -hT
- 安装依赖包
yum -y install e2fsprogs-devel e2fsprogs-libs gcc gcc-c++
- 编译安装extundelete
cd /test
wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4/
./configure --prefix=/usr/local/extundelete && make && make install 或 ./configure && make && make install
ln -s /usr/local/extundelete/bin/* /usr/bin/
- 模拟删除并执行恢复操作
cd /test
echo a > a
echo a > b
echo a > c
echo a > d
ls
extundelete /dev/sdc1 --inode 2 #查看文件系统/dev/sdc1下存在哪些文件,i节点是从2开始的,2代表该文件系统最开始的目录。
rm -rf a b
extundelete /dev/sdc1 --inode 2
cd ~
umount /test
extundelete /dev/sdc1 --restore-all #恢复/dev/sdc1 文件系统下的所有内容
#在当前目录下会出现一个RECOVERED_FILES/目录,里面保存了已经恢复的文件
extundelete /dev/sdc1 --restore-all --output-dir /path/to/your/target_directory #恢复到指定文件夹
ls RECOVERED FILES/
3.2 恢复误删除的XFS文件
XFS类型文件备份和恢复
CentOS 7系统默认采用XFS类型的文件,XFS类型的文件可使用xfsdump与xfsrestore工具进行备份恢复。xfsdump的备份级别有两种: 0表示完全备份; 1-9表示增量备份。xfsdump的备份级别默认为0。
xfsdump的命令格式为:
xfsdump |-f 备份存放位置 要备份的路径或设备文件
xfsdump命令常用的选项:
- -f: 指定备份文件目录
- -L: 指定标签session label
- -M: 指定设备标签media labe
- -s: 备份单个文件,-s后面不能直接跟路径
xfsdump使用限制:
-
只能备份已挂载的文件系统
-
必须使用root的权限才能操作
-
只能备份XFS文件系统
-
备份后的数据只能让xfsrestore解析
-
不能备份两个具有相同UUID的文件系统(可用blkid命令查看)
-
使用fdisk创建分区/dev/sdb1,格式化xfs文件系统
fdisk /dev/sdb 或 partprobe /dev/sdb
mkfs.xfs /dev/sdb1 # mkfs.xfs [-f] /dev/sdb1
mkdir /data
mount /dev/sdb1 /data/
cd /data
cp /etc/passwd ./
mkdir test
touch test/a
- 使用xfsdump命令备份整个分区
rpm -qa | grep xfsdump
yum install -y xfsdump
xfsdump -f /opt/dump_sdb1 /dev/sdb1 [-L dump_sdb1 -M sdb1]
xfsdump -f /opt/dump_sdb /dev/sdb1 -L dump_sdb -M sdb1
- 模拟数据丢失并使用xfsrestore命令恢复文件
cd /data/
rm -rf ./*
ls
xfsrestore -f /opt/dump_sdb1 /data/
拓展
遇见这种报错
[root@localhost /]# mkfs.xfs /dev/sdb6
/dev/sdb6: No such file or directory
Usage: mkfs.xfs
/* blocksize */ [-b log=n|size=num]
/* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx]
/* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,
(sunit=value,swidth=value|su=num,sw=num|noalign),
sectlog=n|sectsize=num
/* force overwrite */ [-f]
/* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,
projid32bit=0|1]
/* no discard */ [-K]
/* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n
sunit=value|su=num,sectlog=n|sectsize=num,
lazy-count=0|1]
/* label */ [-L label (maximum 12 characters)]
/* naming */ [-n log=n|size=num,version=2|ci,ftype=0|1]
/* no-op info only */ [-N]
/* prototype file */ [-p fname]
/* quiet */ [-q]
/* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx]
/* sectorsize */ [-s log=n|size=num]
/* version */ [-V]
devicename
<devicename> is required unless -d name=xxx is given.
<num> is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB),
xxxm (xxx MiB), xxxg (xxx GiB), xxxt (xxx TiB) or xxxp (xxx PiB).
<value> is xxx (512 byte blocks).
解决方法
使用 partprobe
重新读取分区表
[root@localhost /]# partprobe /dev/sdb
四、日志管理
4.1 内核及系统日志
内核及系统日志由系统服务rsyslog统一管理,主配置文件为/etc/rsyslog.conf。Linux操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。
常见的一些日志文件:
- 内核及公共消息日志:
- /var/log/messages: 记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
- 计划任务日志:
- /var/log/cron: 记录crond计划任务产生的事件信息。
- 系统引导日志:
- /var/log/dmesg: 记录Linux系统在引导过程中的各种事件信息。
- 邮件系统日志:
- /var/log/maillog: 记录进入或发出系统的电子邮件活动。
- 用户登录日志:
- /var/log/secure: 记录用户认证相关的安全事件信息。
- /var/log/lastlog: 记录每个用户最近的登录事件。二进制格式
- /var/log/wtmp:
记录每个用户登录、注销及系统启动和停机事件。二进制格式
- /var/run/btmp: 记录失败的、错误的登录尝试及验证事件。二进制格式
查看rsyslog.conf配置文件
vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info #表示info等级及以上的所有等级的信息都写到对应的日志文件里
mail.none #表示某事件的信息不写到日志文件里(这里比如是邮件)
Linux系统内核日志消息的优先级别(数字等级越小,优先级越高,消息越重要) :
- EMERG(紧急):会导致主机系统不可用的情况。
- ALERT(警告):必须马上采取措施解决的问题。
- CRIT(严重):比较严重的情况。
- ERR (错误) :运行出现错误。
- WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
- NOTICE (注意) :不会影响正常功能,但是需要注意的事件。
- INFO(信息):一般信息。
- DEBUG(调试):程序或系统调试信息等。
公共日志/var/log/messages文件的记录格式
- 时间标签:消息发出的日期和时间。
- 主机名:生成消息的计算机的名称。
- 子系统名称:发出消息的应用程序的名称。
- 消息:消息的具体内容。
4.2 详细日志分析命令
常见命令
- users: 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
- who: 命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who的默认输出包括用户名、终端类型、登录日期及远程主机。
- w: 命令用于显示当前系统中的每个用户及其所运行的进程信息,比users、who命令的输出内容要丰富一些。
- last: 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过last命令可以及时掌握Linux主机的登录情况,若发现未经授权的用户登录过,则表示当前主机可能已被入侵。
- lastb: 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除了使用lastb命令查看以外,也可以直接从安全日志文件/var/log/secure中获得相关信息。
系统常见日志
- /var/log/messages: 系统主日志文件
[root@localhost ~]# cat /var/log/messages | wc -l
3784
- 使用tail查看日志
tail -f /var/log/messages
tail -100 /var/log/messages
-
/var/log/dmesg: 开机后的内核自检信息,dmesg命令看的是一样的
-
/var/log/secure: 涉及到登录,验证之类的都会记录比如su
用户日志采用二进制格式,但可以用命令查看,避免人为修改内容,保证日志的有效性
- /var/log/wtmp (last)
- /var/log/btmp (lastb)
- /var/log/lastlog (lastlog): 所有账号的登录信息
其他服务的日志
- /var/log/yum.log
- /var/log/cron
4.3 扩展日志工具
journalctl工具是CentOS-7才有的工具
Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件在/etc/systemd/journald.conf。
ps -ef | grep journald
journalctl -b # 查看本次启动的日志
journalctl -k # 查看内核日志
journalctl | wc -l # 查看系统总共的日志条数
journalctl -xe # 经常用来查看最近报错的日志
- -e: 从结尾开始看
- -x: 提供问题相关的网址
研究日志工具
学生可研究以下日志工具:Webmin、Webalizer、Awstats等专用日志分析工具。
4.4 日志文件分析方法
文本格式的日志文件
对于大多数文本格式的日志文件(如内核及系统日志、大多数的程序日志),只要使用tail、more、less、cat等文本处理工具就可以查看日志内容。
二进制格式的日志文件
对于一些二进制格式的日志文件(如用户日志),则需要使用特定的查询命令。
内核及系统日志
内核及系统日志功能主要由默认安装的rsyslog-7.4.7-16.el7.x86_64.rpm软件包提供。rsyslog服务所使用的配置文件为/etc/rsyslog.conf。通过查看/etc/rsyslog.conf文件中的内容,可以了解到系统默认的日志设置。
过滤空行
grep -v "^$" /etc/rsyslog.conf
日志消息的等级
0-7
rsyslog服务
ps -ef | grep rsyslogd # 查看服务是否开启
vim /etc/rsyslog.conf # rsyslog服务配置文件
自定义日志
vim /etc/rsyslog.conf
加入一行内容
*.info /var/log/info.log
systemctl restart rsyslog # 重启服务之后/var/log下面就生成了info.log了
4.5 将日志文件放在日志文件服务器上
查看模块
rpm -ql rsyslog
服务端配置
[root@localhost ~]# vim /etc/rsyslog.conf
# 编辑文件取消第19、20行注释允许服务器使用TCP 514端口接收日志;开启日志的远程传输功能在192.168.10.19
19 $ModLoad imtcp
20 $InputTCPServerRun 514
[root@localhost ~]# netstat -ntap | grep 514 # 查看514端口是否开启
[root@localhost ~]# systemctl restart rsyslog # 重启rsyslog日志服务
客户端配置
[root@www1 ~]# vim /etc/rsyslog.conf
# 修改日志服务配置文件
90 *.* @@192.168.10.19:514 # 把所有日志采用TCP协议发送到192.168.10.19的514端口上;两个@代表使用TCP,一个@代表UDP
[root@localhost ~]# systemctl restart rsyslog # 重启rsyslog日志服务
测试方法
- 测试客户机上新建用户
[root@localhost ~]# useradd liqi
# 服务器端查看
[root@localhost ~]# vim /var/log/secure
- 测试客户机上写日志进去
[root@localhost ~]# logger "this is test log from 192.168.10.19 2"
# 服务器端查看
[root@localhost ~]# vim /var/log/messages
五、日志轮替logrotate
5.1 什么是轮替
rpm/yum和源码都可以使用,rpm/yum直接轮替,不需要额外设置,根据配置文件的设置执行。
/etc/logrotate.conf
dateext参数
weekly 每周一次轮替
daily 每日轮替
monthly 每月轮替
rotate 4次 # 轮替4次
create 新建新日志
dateext 按日期改名,否则会自动改名为file.1、file.2等等
minsize 一定达到这个值才轮替,否则就算时间到了也不轮替
size 只有到达这个值才轮替,跟时间无关
把自己的日志加入轮替
- 编辑配置文件/etc/logrotate.conf(管理不方便)
- 编辑成文件放到/etc/logrotate.d目录下
vim /etc/logrotate.conf
/var/log/mine.log {
weekly
rotate 5
create
}
logrotate -fv /etc/logrotate.conf # 强制执行轮替,但是目录下的都会轮替,-v查看
# 改过配置文件之后必须先把服务重启再把logrotate重启
六、系统调优概述和查看CPU负载相关工具
6.1 系统调优思路
性能优化就是找到系统处理中的瓶颈以及去除这些的过程,性能优化其实是对OS各子系统达到一种平衡的定义。具体步骤如下:
1
. 系统的运行状况: CPU -> MEM -> DISK -> NETWORK -> application
2. 分析是否有瓶颈(依据当前应用需求)
3. 调优(采取一定措施使变得优异)
这些子系统之间关系是相互彼此依赖的,任何一个高负载都会导致其他子系统出现问题。比如: 大量的网页调入请求导致内存队列的拥塞;网卡的大吞吐量可能导致更多的CPU开销;大量的CPU开销又会尝试更多的内存使用请求;大量来自内存的磁盘写请求可能导致更多的CPU以及IO问题。所以要对一个系统进行优化,查找瓶颈来自哪个方面是关键,虽然看似是某一个子系统出现问题,其实有可能是别的子系统导致的。调优就像医生看病,因此需要你对服务器所有地方都了解清楚。
6.2 查看CPU负载相关工具
uptime命令查看系统cpu负载
[root@benet17 ~]# uptime
12:38:33 up 50days, 3 users, load average: 0.06, 0.60, 0.48
# 其内容如下:
12:38:33 当前时间
up 50days 系统运行时间,说明此服务器连续运行50天了
3 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。
例:找出前当系统中,CPU负载过高的服务器?
服务器1: load average: 0.15, 0.08, 0.01 1核
服务器2: load average: 4.15, 6.08, 6.01 1核
服务器3: load average: 10.15, 10.08, 10.01 4核
答案:服务器2负载过高。
经验:单核心,1分钟的系统平均负载不要超过3,就可以,4核心不要超过12,这是个经验值。所以如果服务器的CPU为1核心,则load average中的数字>=3负载过高,如果服务器的CPU为4核心,则load average中的数字>=12负载过高。
任务队列的平均长度是:是系统等待运行队列的长度与当前所有CPU中正在运行的工作的和。
6.3 使用mpstat查看CPU运行情况
[root@benet17 ~]# rpm -qf `which mpstat` #查看安装mpstat命令的安装包。sysstat-9.0.4-18.el6.x86_64 #此软件包,包括很多查看系统状态的软件包。
[root@benet17 ~]# mpstat
-P {|ALL} 表示监控哪个CPU,cpu在[0,cpu个数-1]中取值
参数说明
- usr: 用户空间CPU使用占比。
- nice: 低优先级进程使用CPU占比。nice值大于0。
- sys: 内核空间CPU使用占比。
- iowait: CPU等待IO占比。
- irq: CPU处理硬中断占比。
- soft: CPU处理软中断占比。
- idle: CPU空闲时间占比。
- guest与steal与虚拟机有关,暂不涉及。
示例命令
[root@benet17 ~]# mpstat -P ALL #查看所有CPU运行状态
[root@benet17 ~]# mpstat -P ALL 1 100 #一秒钟刷新一次 连续刷新100次
七、查看Memory运行状态相关工具
7.1 free命令查看内存使用情况
[root@benet17 ~]# free -m
total used free shared buff/cache available
Mem: 1992 692 817 17 482 1100
Swap: 1023 0 1023
注:在centos7系统中available这一列是真正可用内存。available包括了buff/cache中一些可以被释放的内存。当物理内存不够用的时候,内核会把非活跃的数据清空。
通过/proc目录,查看非活跃的内存:
[root@benet17 ~]# cat /proc/meminfo
MemTotal: 3861512 kB
MemFree: 2097060 kB
MemAvailable: 2561660 kB
Buffers: 2084 kB
Cached: 654920 kB
SwapCached: 0 kB
Active: 1199076 kB
Inactive: 317728 kB
Active(anon): 861052 kB # 活跃内存,指进程一直读写的内存空间
Inactive(anon): 13576 kB # 非活跃内存
Active(file): 338024 kB
注:当内存不够用时,kernel总是把不活跃的内存交换到swap空间。如果inactive内存多时,加swap空间可以解决问题,而active多,则考虑加内存。
7.2 实战:找出系统中使用内存最多的进程?
方法1:运行top,然后按下大写的M可以按内存使用率来排序显示
方法2:按照实际使用内存,从大到小排序显示所有进程列表
[root@benet17 ~]# ps -aux --sort -rss | more # 内存降序排序(去掉减号就是升序) 或:
[root@benet17 ~]# ps -aux --sort -rss > a.log
八、查看IO运行状态相关工具
8.1 查看文件系统块大小
对于ext4文件系统,查看文件系统块大小
[root@benet17 ~]# tune2fs -l /dev/sda1 | grep size
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Block size: 1024 # 为1个字节。一个扇区512字节。
对于xfs文件系统,查看文件系统块大小
[root@benet17 ~]# xfs_growfs -l /dev/sda1 | grep bsize
data = bsize=4096 blocks=51200, imaxpct=25
8.2 实战-找出系统中对磁盘读写最多的进程
实战场景1:对于这个服务器,8块磁盘中,哪个硬盘最繁忙?哪个分区最繁忙?
- 通过iostat命令查看IO是否存在瓶颈安装iostat:
[root@benet17 ~]# rpm -ivh /mnt/Packages/sysstat-10.1.5-12.el7.x86_64.rpm
常用参数:
- -d 仅显示磁盘统计信息。
- -k 以K为单位显示每秒的磁盘请求数,默认单位块。
- -p device | ALL 用于显示块设备及系统分区的统计信息。
[root@benet17 ~]# iostat -d -k -p /dev/sda
Linux 2.6.32-220.el6.x86_64 (benet17.cn) 03/20/2017 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 6.64 167.01 18.53 301418 33437
sda1 0.33 1.28 0.00 2317 9
sda2 6.03 164.53 18.52 296949 33428
sda3 0.18 0.80 0.00 1452 0
注:
每列含意:
- kB_read/s 每秒从磁盘读入的数据量,单位为K。
- kB_wrtn/s 每秒向磁盘写入的数据量,单位为K。
- kB_read 读入的数据总量,单位为K。
- kB_wrtn 写入的数据总量,单位为K。
- 测试,给磁盘写入一些内容,写入时尽可能不读磁盘?
[root@benet17 ~]# dd if=/dev/zero of=a.txt bs=10M count=1000 ; sync # 读入的数据用/dev/zero,/dev/zero不会读磁盘的。
sync # 把内存中的数据快速写到磁盘上。只做dd不执行sync,不容易看不出写入效果这一招学到手:1
[root@benet17 ~]# iostat -p sda -dk
Linux 2.6.32-220.el6.x
86_64 (benet17.cn) 03/03/2017 _x86_64_ (4 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 6.07 128.02 463.04 298190 1078577
sda1 0.25 0.99 0.00 2317 9
sda2 5.60 126.10 463.04 293721 1078568
实战场景2:公司的服务器很卡,查看CPU使用率不高,内存也够用,但就是卡,尤其是打开新程序或文件时,更卡。此时是哪出问题了?
这时系统的瓶颈在哪里? 在磁盘IO上。使用iotop命令,查看哪个进程使用磁盘读写最多。
安装:
[root@benet17 ~]# rpm -ivh /mnt/Packages/iotop-0.6-2.el7.noarch.rpm
iotop的参数:
- -o, -only 只显示在读写硬盘的程序
- -d SEC, -delay=SEC 设定显示时间间隔。 刷新时间
iotop常用快捷键:
- <- / ->:左右箭头:改变排序方式,默认是按IO排序。
- r:改变排序顺序。
- o:只显示有IO输出的进程。
- p:进程/线程的显示方式的切换。
- a:显示累积使用量。
- q:退出,按q或ctrl+C。
例1:找出使用磁盘最多的进程
[root@benet17 ~]# iotop -o -d 1 # 显示正在使用磁盘的进程在另一个终端对磁盘进行大量读操作,执行:
[root@benet17 ~]# find /
查看结果:
并且找出使用系统:cpu,内存,磁盘最多进程。
九、查看Network运行状态相关工具
9.1 实战:找出系统中使用网络最多的进程
实战1:使用nload监控总体带宽使用情况
- 安装nload
[root@benet17 ~]# yum install epel-release -y
[root@benet17 ~]# yum install nload -y
- 开始监控
[root@benet17 ~]# nload # 开始监控
然后另一个终端上运行ab,开始测试:
[root@benet17 ~]# rpm -ivh /mnt/Packages/httpd-tools-2.4.6-67.el7.centos.x86_64.rpm
[root@benet17 ~]# ab -n 1000 -c 2 http://www.baidu.com/index.html # 产生一些测试数据
查看结果:
实战2: 使用nethogs找出使用带宽最多的进程
实战情景:突然今天12:00左右,运维人员接到IDC机房电话,说你的网站流量对外输出很多,这样应该怎么办?
- 上传到nethogs到linux上:
nethogs-0.8.5-1.el7.x86_64.rpm 程序包下载:
[root@benet17 ~]# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/nethogs-0.8.5-1.el7.x86_64.rpm
[root@benet17 ~]# rpm -ivh nethogs-0.8.5-1.el7.x86_64.rpm
[root@benet17 ~]# nethogs
- 在另一个终端生成一些数据:
[root@benet17 ~]# wget http://issuecdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_5.5.3.exe
查看结果,找出wget是使用流量最多的进程。
十、查看系统整体运行状态
10.1 使用vmstat查看内存及系统整体运行状态
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写情况。使用vmstat可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率。比top命令节省资源。
注:当机器运行比较慢时,建议大家使用vmstat查看运行状态,不需要使用top,因为top使用资源比较多。
例:
[root@benet17 ~]# vmstat
输入vmstat命令详情看参数
每一列参数作用:
- r 运行状态的进程个数。展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。
- b 不可中断睡眠 正在进行i/o等待--阻塞状态的进程个数 进程读取外设上的数据,等待时
- free 剩余内存,单位是KB
- buffers 内存从磁盘读出的内容
- cached 内存需要写入磁盘的内容
- si swapin swap换入到内存
- so swapout 内存换出到swap 换出的越多,内存越不够用
- bi blockin 从硬盘往内存读。单位是块。把磁盘中的数据读入内存
- bo blockout 从内存拿出到硬盘 (周期性的有值) 写到硬盘
- in 系统的中断次数,cpu调度的次数多
- cs 每秒的上下文切换速度
- CPU上下文切换--程序在运行的时候,CPU对每个程序切换的过程。
10.2 使用sar命令记录系统一段时间的运行状态
安装sar命令
[root@benet17 ~]# yum -y install sysstat
sysstat工具包可以把检查到的信息保存下来,存在/var/log/sa目录下。sar默认显示每10分钟统计一次状态信息(从装sysstat包开始)。
sar命令行的常用格式:
sar [options] [-A] [-o file] t [n]
在命令行中,n和t两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式存放在当前目录下的文件中,file在此处不是关键字,是文件名。options为命令行选项,sar命令的选项很多,下面只列出常用选项:
- -A:所有报告的总和。
- -v:进程、I节点、文件和锁表状态。
- -n:网络接口的情况。 #常用参数
- -u:CPU利用率 #常用参数
- -d:硬盘使用报告。
- -o 文件名:打印到屏幕并将采样结果以二进制形式存入当前目录下的文件中。
- -f 文件名:查看之前保存的二进制文件。
- -r:没有使用的内存页面和硬盘块。
- -g:串口I/O的情况。
- -b:缓冲区使用情况。
- -a:文件读写情况。
- -c:系统调用情况。
- -R:进程的活动情况。
- -y:终端设备活动情况。
- -w:系统交换活动。
- -d:显示磁盘。
- -d 1 100 # 必须得指定次数。
- -c:每秒创建进程的个数。
- -i 1 10 # 指定时间间隔。
- -P:查看cpu。
- -r:查看内存。
- -w:每秒上下文切换次数。
- -o /cpu.sar # 保存并显示。
- -f cpu.sar # 读取。
例1:每2秒采样一次,连续采样5次,观察CPU的使用情况,并将采样结果以二进制形式存入当前目录下的文件cpu.sar中
[root@benet17 ~]# sar -u 2 5 -o cpu.sar # 屏幕显示如下内容,同时内容也会写到当前目录的./cpu.sar中
[root@benet17 ~]# sar -u 2 5 -o cpu.sar
Linux 3.10.0-693.2.2.el7.x86_64 (benet17.cn) 2018年10月15日 _x86_64_ (4 CPU) 22时29分59秒 CPU %user %nice %system %iowait %steal %idle
22时30分01秒 all 1.52 0.13 2
.40 0.63 0.00 95.33
22时30分03秒 all 0.00 0.00 0.50 1.13 0.00 98.37
22时30分05秒 all 0.00 0.00 0.25 0.00 0.00 99.75
22时30分07秒 all 0.12 0.00 0.12 0.00 0.00 99.75
22时30分09秒 all 0.13 0.00 0.25 0.00 0.00 99.62
平均时间: all 0.35 0.03 0.70 0.35 0.00 98.57
在显示内容包括:
- %usr:CPU处在用户模式下的时间百分比。
- %sys:CPU处在系统模式下的时间百分比。
- %wio:CPU等待输入输出完成时间的百分比。
- %idle:CPU空闲时间百分比。
在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
例2:查看二进制文件cpu.sar中的内容
[root@benet17 ~]# sar -u -f cpu.sar
注:sar命令即可以实时采样,又可以对以往的采样结果进行查询。
64_ (4 CPU) 22时29分59秒 CPU %user %nice %system %iowait %steal %idle
22时30分01秒 all 1.52 0.13 2
.40 0.63 0.00 95.33
22时30分03秒 all 0.00 0.00 0.50 1.13 0.00 98.37
22时30分05秒 all 0.00 0.00 0.25 0.00 0.00 99.75
22时30分07秒 all 0.12 0.00 0.12 0.00 0.00 99.75
22时30分09秒 all 0.13 0.00 0.25 0.00 0.00 99.62
平均时间: all 0.35 0.03 0.70 0.35 0.00 98.57
[外链图片转存中...(img-69ktoed1-1720956501165)]
**在显示内容包括:**
- %usr:CPU处在用户模式下的时间百分比。
- %sys:CPU处在系统模式下的时间百分比。
- %wio:CPU等待输入输出完成时间的百分比。
- %idle:CPU空闲时间百分比。
在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
#### 例2:查看二进制文件cpu.sar中的内容
```sh
[root@benet17 ~]# sar -u -f cpu.sar
注:sar命令即可以实时采样,又可以对以往的采样结果进行查询。
[外链图片转存中…(img-ko28WKqP-1720956501165)]