文件/目录
ls 文件列表
1 | # -1 :每个文件展示一行 -l :展示全部信息(权限, 时间等, 首字母为文件类型: -:普通文件 d:文件夹 s:socket文件 l:链接文件) |
mkdir 建目录
1 | mkdir dir # 创建目录 |
rm 删除
1 | rm file # 删除前需要确认 |
cp 复制
1 | cp file1 path/ # 复制到目录, 保持文件名 |
mv 移动
1 | mv -i file1 file2 # 如果file2已存在则提示 |
chmod 改权限
ls -al
输出类似-rw-r--r-- 1 root root 302108 11-13 06:03 xx.log
的内容. 分三部分: 文件所属人的权限u
, 文件所属组的权限g
, 其他用户的权限o
.
权限范围:
- u : 目录或文件的当前用户
- g : 目录或文件的当前群组
- o : 除了目录或文件的当前用户和群组之外的用户或者群组
- a : 所有的用户及群组
权限代号:
- r : 读权限, 用数字4表示
- w : 写权限, 用数字2表示
- x : 执行权限, 用数字1表示
- - : 删除权限, 用数字0表示
- s : 特殊权限
1 | chmod a+x file # 写法1, 所有人加执行权限 |
chown 改所属
1 | chown root file # 修改文件所属人 |
find 查找
1 | find -name "Hello.java" # 按名称在当前目录遍历查找 |
locate
1 | locate pwd # 类似find -name, 但该命令较快, 因为它是从数据库(/var/lib/locatedb)里查询, 可以使用updatedb命令更新数据 |
which
1 | which grep # 在PATH变量指定的路径中, 查询某个命令的位置, 并且返回第一个搜索结果 |
whereis
1 | # 只能搜索程序名, 而且只搜索二进制(-b), man文件(-m), 和源码(-s) |
type
1 | # 区分某个命令是否是shell自带的 |
sort
1 | # -f 忽略大小写, -C检查文件是否已排好序,如果乱序,不输出内容,仅返回1 |
uniq
1 | uniq -c # 显示重复次数 |
wc
1 | wc -l # 统计行数 |
realpath
readlink
文件内容
cat 读取内容
1 | cat file1 file2 # 顺序打印多个文件内容 |
grep 过滤
1 | # -i :不区分大小写; -4 :前后4行; -n :输出行号 |
tar 压缩包
1 | # -c :创建压缩文件; -x :解压压缩文件; -t :查看压缩文件 |
tail/head 头尾
1 | head file # 默认展示前10行 |
less/more 分段浏览
1 | # more只能往后看, less可以看后翻页 |
sed 基于正则的流处理器
sed是一种在线编辑器, 每次处理一行内容. 处理时, 把当前行存储在临时缓冲区中, 称为”模式空间”(pattern space), 接着sed命令处理缓冲区中的内容. 处理完成后, 将缓冲区内容输出到屏幕. 然后接着处理下一行, 直至文件结束.
打印 p参数
1 | # 匹配fish并输出, 但是匹配到的行被输出了2遍, 这是因为sed会把待处理的信息也输出了 |
文本替换 s参数
1 | # 把一行上的每个(/g)单词 my 都替换成 your, 所有行都处理 |
地址表示法
表达式 | 说明 |
---|---|
n | 行号 |
$ | 最后一行 |
/regexp/ | 所有匹配该正则的文本行 |
addr1,addr2 | 从addr1到addr2范围内的文本行, 包含addr2 |
first~step | 从first行开始, 每个step的文本行, 例: 1~2值每个奇数行 |
addr1,+n | 从addr1开始到后面的n行 |
addr! | 除了addr之外的其他文本行 |
在行前插入一行 i参数
1 | # 在第一行前插入一行 This is a test line |
在行后插入一行 a参数
1 | # 在第一行后插入一行 This is a test line |
替换匹配行 c参数
1 | # 替换第二行 |
删除匹配行 d参数
1 | # 删除1到3行 |
命令打包
1 | # 对3到6行, 匹配到This就删除这一行 |
awk 格式化流处理器
1 | # 打印第1列和第3列 $0表示整行 |
过滤记录
1 | # 第3列等于0 且 第6列等于LISTEN 还有 != < <= > >= |
内建变量
变量名 | 说明 |
---|---|
$0 | 当前记录, 即整行内容 |
$1 ~ $n | 当前记录的第n个字段, 字段间由FS分隔 |
FS | 输入字段分隔符, 默认是空格或Tab |
NF | 当前记录的字段个数, 即有多少列 |
NR | 已经读出的记录数, 即行号, 从1开始, 如果有多个文件, 该值会不断累加 |
FNR | 当前记录数, 与NR不同的是, 该值是各个文件自己的行号 |
RS | 输入的记录分隔符, 默认为换行符 |
OFS | 输入字段分隔符, 默认为空格 |
ORS | 输出记录分隔符, 默认为换行符 |
FILENAME | 当前输入文件的名称 |
1 | awk '$1=="tcp6" && $6=="LISTEN" {printf "%s %-20s %s\n", NR,$4,$5}' input.txt |
指定分隔符
1 | awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd |
字符串匹配
1 | # 过滤第6列匹配WAIT ~ 表示模式开始 //中是模式 |
拆分文件
1 | # 按第6列分隔文件 NR!=1表示不处理第一行 |
统计
1 | # 计算文件大小总和 |
awk脚本
语法如下:
- BEGIN{ 这里面放的是执行前的语句 }
- {这里面放的是处理每一行时要执行的语句}
- END {这里面放的是处理完所有的行后要执行的语句 }
示例
1 | $ cat score.txt |
环境变量
使用-v
和ENVIRON
与环境变量交互, 使用ENVIRON
的环境变量需要export
1 | $ x=5 |
系统信息
uname
1 | uname -a # Linux host.localdomain 4.10.5-1.el6.elrepo.x86_64 #1 SMP Wed Mar 22 14:55:33 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux |
passwd
存放用户信息:
/etc/passwd
/etc/shadow
存放组信息:
/etc/group
/etc/gshadow
用户文件信息组成:
例: jack:X:503:504:::/home/jack/:/bin/bash
jack //用户名
X //口令,密码
503 //用户id, 0代表root, 普通用户从500开始
504 //所在组
: //描述
/home/jack/ //用户的家目录
/bin/bash // 用户默认shell
组文件信息组成:
例: jack:$!$:???:13801:0:99999:7:::
jack // 组名
$!$ // 被加密的口令
13801 // 创建日期与今天相隔的天数
0 // 口令的最短位数
99999 // 用户口令
7 // 到7天时提醒
* // 禁用天数
* // 过期天数
1 | passwd # 命令行修改密码, 先输入旧的, 再输入新的 |
top 任务管理器
1 | $ top |
前5行为信息统计区:
- 16:41:15 - 系统当前时间; up 58 days, 4:44 - 运行时长, 期间没有重启过; 1user - 当前有1个用户登录; load average: 0.18, 0.23, 0.22 - 系统在过去1分钟, 5分钟, 15分钟的负载情况
- 系统当前有137个进程, 1个在运行, 136个在休眠, 0个停止, 0个僵尸态
- 1.3%us - 用户空间占用CPU的百分比; 0.6%sy - 内核空间占用CPU的百分比; 0.0%ni - 改变过优先级的进程占用CPU的百分比; 97.5%id - 空闲CPU百分比; 0.4%wa - IO等待占用CPU百分比; 0.0%hi - 硬中断(Hardware Interrunpt)占用CPU百分比; 0.2%st - 软中断占用CPU百分比
- 3918972k total - 物理内存总容量(4G); 3714896k used - 使用中的内存容量; 204076k free - 空闲的内存容量; 9192k buffers - 缓存的内存容量
- 2096440k total - 交换区总容量(2G); 59020k used - 使用的交换区容量; 2037420k free - 空闲的交换区容量; 194376k cached - 缓冲的交换区容量
- 空行
- 进程状态
- PID - 进程id
- USER - 进程所有者
- PR - 进程优先级
- NI - nice值, 负值表示高优先级, 正值表示低优先级
- VIRT - 进程使用的虚拟内存总量, 单位KB, VIRT=SWAP+RES
- RES - 进程使用的未被换出的物理内存大小, KB. RES=CODE+DATA
- SHR - 共享内存大小, KB.
- S - 进程状态
- %CPU - 上次更新到现在的CPU时间占用百分比
- %MEN - 进程使用的物理内存百分比
- TIME+ - 进程使用的CPU时间总计, 单位: 1/100秒
- COMMAND - 进程使用的命令
load average : 处理进程占CPU能力的百分比, 每隔5秒钟检查一次. 如果CPU每分钟最多处理100个进程,那么系统负荷0.2,意味着CPU在这1分钟里只处理了20个进程. 超过1说明有进程在排队等待CPU处理. 单CPU时负载大于0.7就需要注意了. 达到5时系统基本死机状态.
cat /proc/cpuinfo
命令可查看CPU信息,grep -c 'model name' /proc/cpuinfo
查看cpu核心数. 负载值不要超过核心数
应该关注15分钟的负载值, 1分钟的说明只是暂时现象
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
查看线程
1 | top -H -p 1234 |
交互操作
q
退出top命令<Space>
立即刷新s
设置刷新时间间隔c
显示命令完全模式t
显示或隐藏进程和CPU状态信息m
显示或隐藏内存状态信息l
显示或隐藏uptime信息f
增加或减少进程显示标志S
累计模式,会把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+P
按%CPU使用率排行T
按MITE+排行M
按%MEM排行u
指定显示用户进程r
修改进程renice值kkill
进程i
只显示正在运行的进程W
保存对top的设置到文件^/.toprc,下次启动将自动调用toprc文件的设置1
显示各逻辑CPU状况h
帮助命令
ps 查看进程
1 | # linux进程状态: 运行(R), 可中断的睡眠状态(S), 不可中断的睡眠状态(D), 僵尸(Z), 停止(T), 退出,即将被销毁(X) |
网络
ping 测试网络通断与延迟
1 | ping www.baidu.com |
Tcpping
ping命令是基于ICMP协议, 遇到某些主机会禁用ICMP协议导致Ping命令失效, 这时可以使用基于tcp协议的工具, 比如: tcpping, tcping, psping, hping, paping等
tcpping安装步骤如下:
1 | # 1. tcpping 脚本依赖 tcptraceroute 组件, 所以必须先安装 tcptraceroute |
hping是一个命令行下使用的 TCP/IP 数据包组装/分析工具, 它不仅能发送 ICMP 回应请求, 它还可以支持 TCP、UDP、ICMP 和 RAW-IP 协议
1 | # 安装 |
ifconfig 网络管理
1 | # 显示网络设备信息(激活状态的) |
IP 网络配置
1 | # 显示网络接口信息 |
netstat
1 | netstat -natp | grep 3306 |
我们常说的丢包有三种:
- 一种是内核能够记录的,也就是协议栈上的丢包;
- 另一种是网卡能够记录的,就是网卡处理不过来丢包;
- 第三种就是传输过程中被丢弃的,也就是离开本机之后,未能到达目标主机的。
不管哪种丢包,根据TCP协议的重传规则,我们都可以通过重传来估算系统的丢包情况:
1 | $ netstat -st | grep retrans |
查看全队列配置情况
1 | $ netstat -st | grep SYN |
如果xx times the listen queue of a socket overflowed
和 xx SYNs to LISTEN sockets dropped
出现持续的增长, 说明服务器的全队列过小, 全队列发生溢出, 后续的请求就会被丢弃, 服务端出现请求数量上不去的现象.
查看所有端口的统计信息,-st
/-su
:统计TCP/UDP
1 | $ netstat -s |
通常我们可以通过查找 netstat -s 中 overrun、 collapse、pruned 等事件来观察,如果相关的统计项一直都在增长,那么说明应用的接收缓冲区需要调整了
ss - 网络
1 | # 显示所有TCP连接 |
-a
显示所有套接字-l
显示监听状态的套接字-s
显示套接字使用概况-t
仅显示tcp连接,-u
仅显示udp连接-4
仅显示IPv4套接字-6
仅显示IPv6套接字-p
显示使用该套接字的进程信息, 会显示进程命令/进程id/文件描述符-m
显示套接字的内存使用情况-e
显示详细的套接字信息-i
显示TCP内部信息-r
解析主机名-n
不解析服务名称(不加的话不显示端口, 而是显示服务名)
TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
lsof 一切皆文件
用于查看打开文件的进程, 进程打开了哪些文件, 端口等. 由于lsof命令需要访问核心内存和各种文件, 所以需要root用户执行.
1 | $ lsof /iflytek/server/jdk1.8.0_71/bin/java |
COMMAND
: 进程名称 PID
: 进程id USER
: 进程所有者 FD
: 文件描述符 TYPE
: 文件类型 DEVICE
: 磁盘名称 SIZE
: 文件大小 NODE
: 索引节点(文件在磁盘上的标识) NAME
: 被打开文件的确切名称
1 | # 查询某个用户打开的文件 |
ethtool 网卡信息查看
1 | [root@jzcpx-no ~]# ethtool enp95s0f0 |
Speed: 10000Mb/s
万兆网卡, 最大1.22GB/s
nslookup 查询DNS记录
1 | $ nslookup nslookup www.baidu.com |
dig 查询DNS解析过程
1 | $ dig baidu.com |
tcpdump 抓包
抓取经过eth0接口请求8080端口的tcp请求
1 | tcpdump tcp -i eth0 -s 0 -nn -vvv and dst port 8080 -w 8080dump.cap |
- 类型:
host
net
port
- 方向:
src
dst
src or dst
src and dst
- 协议:
ip
tcp
udp
arp
icmp
….
1 | # 监听特定网卡 |
1 | tcpdump tcp -i eth0 -t -s 0 -c 100 -n and dst port ! 22 and src net 192.168.1.0/24 -w tcpdump.cap |
tcp
: tcp udp ip icmp arp等这些选项都要放到第一个参数的位置,用来过滤数据报的类型-i eth0
:只抓取接口eth0的包-t
:不显示时间戳-s 0
:默认只抓取68字节,加上-s 0
后可以抓取完整的数据包-c 100
:只抓取100个数据包-n
:将地址以数字形式显示,否则显示为主机名-nn
:除了有-n
的作用,还把端口显示为数值,否则显示为端口服务名dst port ! 22
:不抓取目标端口是22的数据包src net 192.168.1.0/24
:数据包的源网络地址为192.168.1.0/24-w tcpdump.cap
:抓取结果写入文件-X
:以16进制和ASCII码显示包数据,现场分析数据包内容必备-v
-vv
-vvv
:输出结果详细程度递增
wget 文件下载
1 | wget -O file www.xx.com # 保存到指定文件 |
curl
1 | # GET www.xx.com/search?a=aa&b=bb |
scp 远程拷贝
1 | # 从远程拷贝回本地 |
mount 磁盘挂载
1 |
time 统计命令执行时间
1 | $ time ps axu |
real
挂钟时间, 即命令从开始到结束的时间, 包括其他进程所占用的时间片和进程被阻塞所花费的时间user
花费在用户模式中的CPU时间, 这是唯一真正用于执行进程所花费的时间, 其他进程和阻塞时间不算在内sys
花费在内核模式中的CPU时间, 代表在内核中执行系统调用所花费的时间, 这也是真正由进程使用的CPU时间
date 系统时间
1 | date |
应用
yum
1 | yum check-update # 列出所有可更新的软件清单 |
使用国内yum源
1 | # 1. 备份原始源信息 |
阿里云与163源
CentOS7
http://mirrors.aliyun.com/repo/Centos-7.repo
http://mirrors.163.com/.help/CentOS7-Base-163.repo
CentOS6
http://mirrors.aliyun.com/repo/Centos-6.repo
http://mirrors.163.com/.help/CentOS6-Base-163.repo
CentOS5
rpm 软件包管理
对于已安装软件
1 | rpm -qa | grep mysql # 查询 |
对于未按照软件包
1 | rpm -qip mysql-community-server-5.7.16-1.el7.x86_64.rpm # 查询软件包信息 |
安装升级删除
1 | rpm -ivh xx.rpm --test # 检查依赖关系, 不会真的安装 |
service
systemctl
init.d
journalctl
export
1 | export -p # 列出当前的环境变量值 |
其他
xargs
1 | cat file.txt | xargs # 所有内容单行输出 |
seq 生成连续的数字序列
1 | # 输出1到5 |
crontab 定时任务
-u user
: 对指定用户的crontab服务进行处理
1 | * * * * * |
crontab的日志文件是/var/log/cron
查看cron服务状态systemctl status crond
注意
命令中
%
是特殊字符, 需要加反斜线\
转义脚本涉及到的文件路径要写全局路径
脚本用到java或其他环境变量时, 先通过
source
命令引入1
2
3
4!/bin/sh
source /etc/profile
export RUN_CONF=/home/test/cbp.jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &当手动执行脚本OK, 但crontab不执行时, 很可能是环境变量的问题, 可尝试直接在crontab中引入环境变量
1
0 * * * * . /etc/profile;/bin/sh /home/test/restart.sh
每次任务执行完, 系统会将输出信息通过邮件发给当前用户, 可以通过忽略日志输出避免
1 | 0 * * * * /xx.sh > /dev/null 2>&1 |
新创建的定时任务不会马上执行, 至少要过2分钟, 但重启cron则马上执行. 当crontab失效时可以尝试/etc/init.d/crond restart
解决问题. 可以查看日志/var/log/cron
定位问题.
nohup
nohup 是 no hang up 的缩写,就是不挂断的意思。该命令可以在你退出帐户/关闭终端时忽略SIGHUP信号,从而继续运行相应的进程。在缺省情况下该作业的所有输出都被重定向到当前目录的nohup.out的文件中, 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
1 | nohup java -jar xxx.jar > /dev/null 2>&1 & |
&
在后台运行,但是关闭shell后,对应的服务也会关闭,因为对SIGHUP信号不免疫。此时配合nohup可以让应用继续运行。 2>&1
是将标准出错重定向到标准输, /dev/null 2>&1
将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃
系统监控
下面大部分命令属于sysstat
软件包的一部分, 执行yum install -y sysstat
mpstat - cpu监控
每隔1s打印所有cpu使用情况, 间隔1s,打印10次
1 | [root@demo ~]# mpstat -P ALL 1 10 |
参数说明:
-P
: ALL
或 0 - CPU个数-1
监控哪个cpu
结果说明:
1 | %user 在间隔的时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100 |
vmstat 内存监控
1 | # 每秒1次, 输出3次 |
- procs 进程
- r 运行队列中进程数量
- b 等待IO的进程数量
- memory 内存
- swpd 使用虚拟内存大小
- free 可用内存大小
- buff 用作缓冲的大小
- cache 用作缓存的大小
- swap 交换区
- si 每秒从交换区写到内存的大小
- so 每秒写入到交换区的大小
- IO
- bi 每秒读取的块数 这里的块不同于文件系统的块, 是操作系统内部用于缓存和缓冲操作的, 当前大小为1024Bytes
- bo 每秒写入的块数
- system
- in 每秒中断数 包括时钟中断
- cs 每秒上下文切换数
- CPU
- us 用户进程执行时间
- sy 系统进程执行时间
- id 空闲时间, 包括IO等待时间
- wa 等待IO时间
- st 管理程序(hypervisor 虚拟化)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比
iostat IO监控
1 | $ iostat 1 3 |
CPU属性
- %user CPU在用户模式下的时间百分比
- %nice CPU在带NICE值的用户模式下的时间百分比
- %system CPU在系统模式下的时间百分比
- %iowait CPU等待输入输出完成的时间百分比
- %steal 管理程序维护另一个虚拟处理器时, 虚拟CPU的无意识等待时间百分比
- %idle CPU空闲时间百分比
%iowait值过高表示磁盘存在IO瓶颈; %idle值高表示CPU比较空闲; 如果%idle值高但系统响应慢, 可能是CPU等待内存分配; %idle持续低于10说明系统CPU处理能力不足
disk属性
- tps 设备每秒是IO请求数, 多个逻辑请求可能会被合并为一次IO请求, 一次IO请求的大小是未知的
- kB_read/s 每秒从设备读取的数据量
- kB_wrtn/s 每秒向设备写入的数据量
- kB_read 读取的数据总量
- kB_wrtn 写入的数据总量
1 | # 显示更详细的io信息 |
rrqm/s
每秒进行 merge 的读操作数目。即 rmerge/swrqm/s
每秒进行 merge 的写操作数目。即 wmerge/sr/s
每秒完成的读 I/O 设备次数。即 rio/sw/s
每秒完成的写 I/O 设备次数。即 wio/srsec/s
每秒读扇区数。即 rsect/swsec/s
每秒写扇区数。即 wsect/srkB/s
每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。wkB/s
每秒写K字节数。是 wsect/s 的一半。avgrq-sz
平均每次设备I/O操作的数据大小 (扇区)。avgqu-sz
平均I/O队列长度。await
平均每次设备I/O操作的等待时间 (毫秒)。r_await
平均每次设备读I/O操作的等待时间 (毫秒)。w_await
平均每次设备写I/O操作的等待时间 (毫秒)。svctm
平均每次设备I/O操作的服务时间 (毫秒)。%util
一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有大量io在等待。
pidstat - 进程资源占用监控
pidstat 是sysstat软件套件的一部分, CentOS使用该命令安装: yum install sysstat
常用参数
-u
默认参数,显示各个进程的 CPU 统计信息-r
显示各个进程的内存使用情况-d
显示各个进程的 IO 使用-w
显示各个进程的上下文切换
显示所有进程的CPU使用信息, pidstat
或 pidstat -u -p ALL
1 | $ pidstat |
PID
进程ID%usr
进程在用户空间占用cpu的百分比 %system
进程在内核空间占用cpu的百分比%guest
进程在虚拟机占用cpu的百分比%CPU
进程占用cpu的百分比CPU
处理进程的cpu编号Command
当前进程对应的命令
查看内存
1 | $ pidstat -r -p 1205 |
PID
进程标识符Minflt/s
任务每秒发生的次要错误,不需要从磁盘中加载页Majflt/s
任务每秒发生的主要错误,需要从磁盘中加载页VSZ
虚拟地址大小,虚拟内存的使用KBRSS
常驻集合大小,非交换区五里内存使用KBCommand
当前进程对应的命令
查看io
1 | $ pidstat -d -p 1205 |
PID
进程idkB_rd/s
每秒从磁盘读取的KBkB_wr/s
每秒写入磁盘KBkB_ccwr/s
任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生Command
当前进程对应的命令
查看上下文切换
1 | $ pidstat -w -p 4846 |
PID
进程idCswch/s
每秒主动任务上下文切换数量Nvcswch/s
每秒被动任务上下文切换数量Command
当前进程对应的命令
查看线程信息
1 | $ pidstat -t -p 4846 |
PID
进程ID%usr
进程在用户空间占用cpu的百分比 %system
进程在内核空间占用cpu的百分比%guest
进程在虚拟机占用cpu的百分比%CPU
进程占用cpu的百分比CPU
处理进程的cpu编号Command
当前进程对应的命令
sar - 系统活动报告
统计结果可以输出到文件
1 | sar -o sarfile.log -u 1 3 |
u
cpu使用率q
cpu负载B
内存使用率R
内存页S
swap使用率b
ion
网络d
块设备F
挂载设备m
电源管理
CPU使用率
1 | $ sar -u 1 3 |
CPU
: all表示统计的所有CPU%user
: 用户级运行cpu占比 %nice
:用户级别用于nice操作CPU占比 %system
: 核心级运行CPU占比%iowait
: 用于等待IO操作占用CPU时间的百分比%steal
: 管理程序(hypervisor 虚拟化)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比%idle
: 显示CPU空闲占比, 若%iowait过高则表示磁盘存在IO瓶颈; 若%idel高但系统响应慢则可能是内存不足, cpu在等待分配内存; 若%idle持续<1则系统cpu处理能力不足
内存使用率
1 | $ sar -r 1 3 |
kbmemfree
: 可用内存, 不含buffer/cache kbmemused
: 已用内存, 包含buffer/cache%memused
: kbmemused占总内存百分比kbbuffers
: buffer空间大小 kbcached
:cache空间大小kbcommit
: 为了确保不溢出而需要的内存(RAM + swap) %commit
: kbcommit占比kbactive
: 最近使用的不被回收的 kbinact
: 不经常使用的容易被回收 kbdirty
: 赃页,等待写入磁盘
CPU负载
1 | $ sar -q 1 3 |
runq-sz
: 运行队列长度, 即等待运行的进程数plist-sz
: 进程列表中进程和线程的数量ldavg-1
ldavg-5
ldavg-15
: 过去1/5/15分钟系统的平均负载blocked
: 正在等待io的任务数量
内存页状态
1 | $ sar -B 1 3 |
pgpgin/s
pgpgout/s
: 每秒从磁盘换入/出到内存的字节数(KB)fault/s
: 每秒系统产生的缺页数, 即major+minor; majflt/s
: 每秒产生的主缺页数pgfree/s
: 每秒被放入空闲队列的页个数 pgscank/s
: 每秒被kswapd扫描的页数pgscand/s
: 每秒直接被扫描的 pgsteal/s
: 每秒从cache中被清除用来满足内存需要的页数%vmeff
: 每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)
swap信息
1 | $ sar -W 1 3 |
pswpin/s
pswpout/s
: 每秒换入/出的交换页面(swap page)数量
IO和传输速率
1 | $ sar -b 1 3 |
tps
: 每秒物理设备的IO请求总数rtps
wtps
: 每秒读/写物理设备的io请求数bread/s
bwrtn/s
: 每秒读写物理设备的数据量, 单位: 块/s, 这里的块等于扇区, 所有大小为512Bytes
文件系统的块大小可以通过blockdev --getbsz /dev/vda
或者 stat -f /dev/vda
查看(块是文件系统里的概念, 扇区(fdisk- l
)是磁盘里的概念, 一般块是扇区的2^n倍)
块设备信息
1 | $ sar -d 1 3 |
tps
: 每秒请求物理磁盘的次数, 多个逻辑请求会被合并成1个io请求, 一次传输的大小是不确定的rd_sec/s
wr_sec/s
: 每秒读写的扇区数量, 扇区大小512Bytesavgrq-sz
: 平均每次io请求的扇区大小avgqu-sz
: 磁盘请求队列的平均长度await
: 从请求磁盘操作到系统完成处理, 每次请求的平均消耗时间(毫秒), 包括请求队列等待时间svctm
: 系统处理每次请求的平均时间(毫秒), 不包括在请求队列中消耗的时间%util
: I/O请求占CPU的百分比, 比率越大, 说明设备带宽使用率越高
网卡流量
-n
参数有6个开关:
- DEV显示网络接口信息。
- EDEV显示关于网络错误的统计数据。
- NFS统计活动的NFS客户端的信息。
- NFSD统计NFS服务器的信息
- SOCK显示套接字信息
- ALL显示所有5个开关
1 | $ sar -n DEV 1 2 |
IFACE
:LAN接口rxpck/s
txpck/s
:每秒钟接收/发送的数据包rxkB/s
txkB/s
:每秒钟接收/发送的字节数 千字节/srxcmp/s
txcmp/s
:每秒钟接收/发送的压缩数据包rxmcst/s
:每秒钟接收的多播数据包
统计网络设备通信失败信息
1 | $ sar -n EDEV 1 3 |
结果
rxerr/s
txerr/s
:每秒钟接收/发送的坏数据包:每秒钟的坏数据包coll/s
:每秒冲突数rxdrop/s
txdrop/s
:因为缓冲充满,每秒钟丢弃的已接收/发送数据包数txcarr/s
:发送数据包时,每秒载波错误数\rxfram/s
:每秒接收数据包的帧对齐错误数rxfifo/s
txfifo/s
:接收/发送的数据包每秒FIFO过速的错误数
IP层统计
1 | $ sar -n IP 1 3 |
IP层错误统计
1 | $ sar -n EIP 1 3 |
TCP连接信息
1 | $ sar -n TCP 1 3 |
active/s
: 新的主动连接 passive/s
: 新的被动连接iseg/s
: 接受的段 oseg/s
: 输出的段
TCP层错误统计
1 | $ sar -n ETCP 1 3 |
atmptf/s
: 每秒重试失败数 estres/s
: 每秒断开连接数
retrans/s
: 每秒重传数 isegerr/s
: 每秒错误数 orsts/s
: 每秒RST数
socket连接信息
1 | $ sar -n SOCK 1 3 |
totsck
: 当前被使用的socket总数tcpsck
: 当前正在被使用的TCP的socket总数udpsck
: 当前正在被使用的UDP的socket总数rawsck
: 当前正在被使用于RAW的skcket总数if-frag
: 当前的IP分片的数目tcp-tw
: TCP套接字中处于TIME-WAIT状态的连接数量
pstack 跟踪进程堆栈
pstack 命令必须由相应进程的属主或 root 运行, 可以使用 pstack 来确定进程挂起的位置, 可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方
1 | $ pstack 4846 |
strace 跟踪进程的系统调用
1 | $ strace cat /dev/null |
free 查询可用内存
1 | free -h |
df 查询磁盘可用空间
1 | $ df -h |
du 磁盘使用统计
1 | # 统计当前目录下各文件/目录占用磁盘大小 |