Linux 运维命令 Collection

Linux 运维命令 Collection

现代计算机基本上都是冯·洛伊曼架构,而对于基础的计算机资源,往往是木桶效应,也就是说,计算机程序的瓶颈一般是由于某一种或几种计算机资源不足而造成的性能问题,这个时候就需要通过一些 Linux命令去排除这些问题,通过增加资源或者替换服务器型号的方式,达到平衡服务器开支和程序稳定的目的。

一般而言,产生计算机瓶颈的资源一般是CPU,内存,磁盘和磁盘io,网络io。当然在一些特定程序下,GPU,文件操作符等,也会形成瓶颈。

这个时候,就需要我们使用一些Linux命令去排查问题

常用 Linux 运维命令

CPU

查询命令

命令 使用方式 常用参数
top 或者 uptime 一般查看平均负载,平均负载表示平均活跃进程数,和 cpu 个数相关  
htop 更直观的top!  
atop 更直观的top!  
mpstat 查看每个 cpu 使用情况 -P ALL 5 监控所有CPU
pidstat -u 查看进程的 cpu 使用情况 -u 5 1 间隔5秒后输出一组数据
-p 指定线程号
pidstat -w 查看进程的上线文切换使用情况
Cswch/s:每秒主动任务上下文切换数量
Nvcswch/s:每秒被动任务上下文切换数量
-w 5 1 间隔5秒后输出一组数据
-p 指定线程号
vmstat 查看进程的上线文切换使用情况
si so :交换磁盘和内存的数据(kb/s)
bi bo: 发送\接收 设备的块数
in: 每秒的中断数,包括时钟中断
cs:每秒的上下文切换数
us sy:用户\系统进程使用的cpu时间(%)
id :cpu空闲时间(%)
wa:等待io所消耗的cpu时间(%)
5 1 间隔5秒后输出1组数据
pstree 查看进程树 -p 查看进程号
1005 查看1005 进程
perf 记录性能事件,使用 Ctrl+ C 退出记录 record -F 99 -p 13204 -g – sleep 30 -F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用 -a 采集所有cpus信息
report 查看报告
top 实时观察
stat 执行一个命令并收集其运行过程中的各个数据,提供一个程序运行情况的总体概览
execsnoop 监控短时进程(不断的崩溃、重启的进程)  
watch -d cat /proc/softirqs 查看中断情况
TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU 锁)
 
sar -c 查看CPU使用情况
%user 用户空间的CPU使用
%nice 改变过优先级的进程的CPU使用率
%system 内核空间的CPU使用率
%iowait CPU等待IO的百分比
%steal 虚拟机的虚拟机CPU使用的CPU
%idle 空闲的CPU
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
sar -W 查看系统swap分区统计情况
pswpin/s 每秒从交换分区到系统的交换页面(swap page)数量
pswpott/s 每秒从系统交换到swap的交换页面(swap page)的数量
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
sar -q 查看平均负载
runq-sz 运行队列的长度(等待运行的进程数,每核的CP不能超过3个)
plist-sz 进程列表中的进程和线程数的数量
ldavg-1\ldavg-5\ldavg-15 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
-q 1 3 查看平均负载

模拟命令

命令 使用方式 常用参数
stress 模拟一个 cpu 使用 100% (usr)
模拟 I/O 压力(iowait)
模拟8 个进程争抢 cpu (wait)
-c 1 –timeout 600
-i 1 –timeout 600
-c 8 –timeout 600
sysbench 以10个线程运行5分钟的基准测试,模拟多线程切换 –threads=10 –max-time=300 threads run
uptime
load average: 0.63, 0.83, 0.88 # 依次则是过去 1 分钟、5 分钟、15 分钟的平均负载

top - 23:15:11 up 8 days,  1:42,  8 users,  load average: 0.03, 0.04, 0.09
                  # 系统运行时间    #当前登录用户数  # 平均负载:
                                                # 如果平均值为 0.0,意味着系统处于空闲状态
                                                # 如果 1min 平均值高于 5min 或 15min 平均值,则负载正在增加
                                                # 如果 1min 平均值低于 5min 或 15min 平均值,则负载正在减少
                                                # 如果它们高于系统 CPU 的数量,那么系统很可能会遇到性能问题(视情况而定)
Tasks: 109 total,   1 running, 108 sleeping,   0 stopped,   0 zombie
       #进程总数      #正在运行   #睡眠             #停止        #僵尸
%Cpu(s):  0.3 us,  0.5 sy,  0.0 ni, 99.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
          #用户空间  #内核空间  #改变优先级 #空闲   #等待输入输出 #硬中断 #软中断  #偷取
KiB Mem :   951924 total,   118024 free,   223148 used,   610752 buff/cache
            #物理内存                           
KiB Swap:        0 total,        0 free,        0 used.   574748 avail Mem
            #交换区内存 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1298 root      10 -10  136364  15104  11520 S   2.0  1.6 252:42.15 AliYunDun
#进程id  #用户 #优先级 #nice值                 #进程状态  
                    #负值表示高优先级          #R:进程在 CPU 的就绪队列中,正在运行或者正在等待运行
                    #正值表示低优先级          #D:进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断
                                            #Z:僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源
                                            #S:可中断状态睡眠,进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入R状态
                                            #I:Idle,空闲状态,对某些内核线程来说,它们有可能实际上并没有任何负载
                                            #进程的所有状态,以下不一定会见到
                                            #T:向一个进程发送SIGSTOP信号,它就会因响应这个信号变成暂停状态S;再向它发送 SIGCONT 信号,进程又会恢复运行
                                            #X:Dead的缩写,表示进程已经消亡
 1568 root      20   0  813000  12352   5384 S   0.3  1.3  13:08.60 aliyun-service
                        #VIRT=SWAP+RES 注意这里是SWAP
                        #VIRT:进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。
                        #RES:常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。
                        #SHR:共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。
    1 root      20   0  191008   3956   2620 S   0.0  0.4   0:05.41 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    5 root      20   0       0      0      0 S   0.0  0.0   0:03.35 kworker/u4:0
    6 root      20   0       0      0      0 S   0.0  0.0   0:01.98 ksoftirqd/0
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.01 migration/0



内存

查询命令

命令 使用方式 常用参数
free 查看内存  
pidstat -r 查看进程的内存 使用情况
Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
VSZ:虚拟地址大小,虚拟内存的使用KB
RSS:常驻集合大小,非交换区五里内存使用KB
-r 5 1 间隔5秒后输出一组数据
-p 指定线程号
sar -r 查看内存使用情况
kbmemfree 空闲的物理内存大小
kbmemused 使用中的物理内存大小 %
memused 物理内存使用率
kbbuffers 内核中作为缓冲区使用的物理内存大小,
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcached 缓存的文件大小
kbcommit 保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)
commit 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值
kbactive
kbinact
kbdirty
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
cachestat 查看缓存的命中率
TOTAL ,表示总的 I/O 次数;
MISSES ,表示缓存未命中的次数;
HITS ,表示缓存命中的次数;
DIRTIES, 表示新增到缓存中的脏页数;
BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;
CACHED_MB 表示 Cache 的大小,以 MB 为单位。
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
cachetop 查看进程缓存的命中率
MISSES ,表示缓存未命中的次数;
HITS ,表示缓存命中的次数;
DIRTIES, 表示新增到缓存中的脏页数;
READ_HIT,读的缓存命中率。
WRITE_HIT,写的缓存命中率。
 
vmstat 查看内存使用情况
swpd 使用的虚拟内存总量
free 空闲的物理内存总量
buff 用作缓冲区的内存总量
cache 用作高速缓存的内存总量
5 1 间隔5秒后输出1组数据
pmap 分析进程内存分布 -d 1234 展示进程内存 - 设备信息
-XX 1234 展示进程内存 - 所有信息
pcstat 指定文件的缓存大小  
memleak 内存泄漏定位  
valgrind 进程内存错误检查,内存初始化,泄漏,越界访问等各种内存错误  

模拟命令

命令 使用方式 常用参数
echo 3 > /proc/sys/vm/drop_caches 清理缓存  
dd 运行dd命令读取文件 if=/dev/sda1 of=/dev/null bs=1M count=1024
free -h
              total        used        free      shared  buff/cache   available
Mem:           929M        144M        139M        980K        645M        637M
Swap:            0B          0B          0B
磁盘和磁盘io

查询命令

命令 使用方式 常用参数
du 检查磁盘大小 -sh ./* 查看当前目录各文件大小
df 检查文件系统的磁盘空间占用情况 -h 查询硬盘空间
-ia 列出各文件系统的i节点使用情况
-T 列出文件系统的类型
ncdu 查看文件大小终端  
iostat 输出磁盘IO 和 CPU的统计信息
device: 磁盘名称
tps:每秒钟发送到的I/O请求数.
Blk_read/s: 每秒读取的block数.
Blk_wrtn/s: 每秒写入的block数.
Blk_read: 读入的block总数.
Blk_wrtn: 写入的block总数.
-d -x 5 1 表示显示所有磁盘I/O的指标
-m 以 M 为单位显示
-k 以 KB 为单位显示
pidstat -d 查看进程的 io 使用情况
kB_rd/s:每秒从磁盘读取的KB
kB_wr/s:每秒写入磁盘KB
kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
5 1 间隔5秒后输出一组数据
-p 指定线程号
dstat 更直观的iostat !  
sar -b 查看IO和传递速率
tps 磁盘每秒钟的IO总数,等于iostat中的tps
rtps 每秒钟从磁盘读取的IO总数
wtps 每秒钟从写入到磁盘的IO总数
bread/s 每秒钟从磁盘读取的块总数
bwrtn/s 每秒钟此写入到磁盘的块总数
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
sar -d 查看磁盘使用情况
tps 每秒I/O的传输总数
rd_sec/s 每秒读取的扇区的总数
wr_sec/s 每秒写入的扇区的总数
avgrq-sz 平均每次次磁盘I/O操作的数据大小(扇区)
avgqu-sz 磁盘请求队列的平均长度 await 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间
svctm I/O的服务处理时间,即不包括请求队列中的时间
%util I/O请求占用的CPU百分比,值越高,说明I/O越慢
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
iotop 类似 top 的工具,用来显示实时进程的磁盘活动。  
filetop 查看系统内核对文件读写情况(linux bbc) -C 输出新内容时不清空屏幕
opensnoop 查看系统调用打开的所有文件(linux bbc)  
biotop top工具(linux bbc)  
blkstrace 块设备IO事件追踪  
strace 进程IO事件追踪  
slabtop 目录项,索引文件,文件系统的缓存  
cat /proc/slabinfo slab是一个用于高效的内存分配对象的内存管理机制。与早些时候机制相比,它可以减少碎片造成的分配和回收。  
cat /proc/meminfo 内存信息  
cat /proc/diskstats 磁盘信息  
cat /proc/${pid}/io 进程io信息  
tune2fs 显示和设置文件系统参数  
hdparm 显示和设置磁盘参数  

模拟命令

命令 使用方式 常用参数
fio 文件系统和磁盘 I/O 性能基准测试工具 随机读fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
随机写fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
顺序读fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
顺序写fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        455M     0  455M   0% /dev
tmpfs           465M     0  465M   0% /dev/shm
tmpfs           465M  596K  465M   1% /run
tmpfs           465M     0  465M   0% /sys/fs/cgroup
/dev/vda1        20G  2.6G   17G  14% /
tmpfs            93M     0   93M   0% /run/user/0
网络io

查询命令

命令 使用方式 常用参数
ss 获取 socket 统计信息 -anp 显示所有监听端口的进程
-t 显示 TCP 协议的 sockets
-u 显示 UDP 协议的 sockets
netstat 监控TCP/IP网络 -atnlp 使用ip地址列出所有处理监听状态的TCP端口,且加上程序名
-t 显示 TCP 协议端口
-u 显示 UDP 协议端口
ifstat 统计网络接口活动状态 -tT 更详细的报告
-a 监控所有网络接口
tcpdump 抓包工具 src 172.21.0.1 and tcp port 8080 -n -s 0 -A 打印来自 ip 172.21.0.1和端口 8080 的包并显示详细信息
-nn -vv -X udp port 11000 udp抓包
-i docker0 host 172.21.0.1 -nn 网卡和 dst/src 的数据
-a    将网络地址和广播地址转变成名字;
-d    将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd    将匹配信息包的代码以c语言程序段的格式给出;
-ddd    将匹配信息包的代码以十进制的形式给出;
-e    在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议;
-f    将外部的Internet地址以数字的形式打印出来;
-l    使标准输出变为缓冲行形式;
-n    指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;
-nn: 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-t    在输出的每一行不打印时间戳;
-v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv    输出详细的报文信息;
-c    在收到指定的包的数目后,tcpdump就会停止;
-F    从指定的文件中读取表达式,忽略其它的表达式;
-i    指定监听的网络接口;
-p: 将网卡设置为非混杂模式,不能与host或broadcast一起使用
-r    从指定的文件中读取包(这些包一般通过-w选项产生);
-w    直接将包写入文件中,并不分析和打印出来;
-s snaplen表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。
-T    将监听到的包直接解释为指定的类型的报文
-X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来
nsenter -n -t xxxx tcpdump port xxxx -n -s 0 -A 宿主机机上可以通过 nsenter 指定容器pid
sar -n DEV 查看系统的网络收发情况
IFACE 表示网卡
rxpck/s 每秒钟接受的数据包
txpck/s 每秒钟发送的数据库
rxKB/S 每秒钟接受的数据包大小,单位为KB
txKB/S 每秒钟发送的数据包大小,单位为KB
rxcmp/s 每秒钟接受的压缩数据包
txcmp/s 每秒钟发送的压缩包
rxmcst/s 每秒钟接收的多播数据包
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
sar -n EDVE 网络设备通信失败信息
rxerr/s 每秒钟接收到的损坏的数据包
txerr/s 每秒钟发送的数据包错误数
coll/s 当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有
rxdrop/s 当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目
txdrop/s 当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目
txcarr/s 当发送数据包的时候,每秒钟载波错误发生的次数
rxfram/s 在接收数据包的时候,每秒钟发生的帧对其错误的次数
rxfifo/s 在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数
txfifo/s 在发生数据包 的时候,每秒钟缓冲区溢出的错误发生的次数
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
sar -n SOCK 统计socket连接信息
totsck 当前被使用的socket总数
tcpsck 当前正在被使用的TCP的socket总数
udpsck 当前正在被使用的UDP的socket总数
rawsck 当前正在被使用于RAW的skcket总数
if-frag 当前的IP分片的数目
tcp-tw TCP套接字中处于TIME-WAIT状态的连接数量
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
sar -n TCP TCP连接的统计
active/s 新的主动连接
passive/s 新的被动连接
iseg/s 接受的段
oseg/s 输出的段
1 10 显示网络收发的报告,间隔1秒输出一组数据,刷新10次
-o test 1 3 保存
-f test 查看
ethtool 查询和控制网络设备驱动程序和硬件设置 -i 显示网卡驱动的信息,如驱动的名称、版本等。
-k 显示网卡Offload参数的状态:on 或 off,包括rx-checksumming、tx-checksumming等。
-a 查看网卡中 接收模块RX、发送模块TX和Autonegotiate模块的状态:启动on 或 停用off。
-p 用于区别不同ethX对应网卡的物理位置,常用的方法是使网卡port上的led不断的闪;N指示了网卡闪的持续时间,以秒为单位。
-s 修改网卡的部分配置,包括网卡速度、单工/全双工模式、mac地址等。
mtr traceroute和 ping 的功能,并且会收集更多的信息 www.baidu.com –report
tcping 测试 tcp udp 运输层的端口, ping是基于ICMP协议,更高级的ping!  
nsenter 可以在指定进程的命令空间下运行指定程序的命令 –target $PID –net – lsof -i
conntrack 统计总的连接跟踪数 -L -o extended wc -l 统计总的连接跟踪数
Wireshark 一般在win上用,图形界面,不会有人看不懂吧?  

模拟命令

命令 使用方式 常用参数
ab 并发100个请求测试Nginx性能,总共测试1000个请求 -c 100 -n 1000 https://www.baidu.com/
python 端口8080测试 -m SimpleHTTPServer 8080
hping3 构建tcpip包工具 -S -p 80 -i u10 192.168.0.30 -S参数表示设置TCP协议的SYN(同步序列号),-p表示目的端口为80# -i u10表示每隔10微秒发送一个网络帧
-c 3 -S -p 80 baidu.com -c表示发送3次请求,-S表示设置TCP SYN,-p表示端口号为80
traceroute 时延网络测试工具 –tcp表示使用TCP协议,-p表示端口号,-n表示不对结果中的IP地址执行反向域名解析
netperf 时延网络测试工具 -H 10.10.10.1 -l 60 -t TCP_STREAM | tee -a netperf.log 在client端执行netperf并保存测试结果
iperf3 重传包网络测试工具 -s -i 1 -p 10000 -s表示启动服务端,-i表示汇报间隔,-p表示监听端口
wrk HTTP 性能测试工具 -c 1000 -t 2 http://192.168.0.30/ -c表示并发连接数1000,-t表示线程数为2
–latency -c 100 -t 2 –timeout 2 http://192.168.0.30/ 测试80端口性能
netstat -atnlp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
#协议                                        #地址                    #tcp状态,tcp的几个状态去看tcp的三次握手和四次挥手
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      575/rpcbind
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1138/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1109/master
tcp        0     64 172.21.142.66:22        14.111.62.60:25857      ESTABLISHED 827/sshd: root@pts/
tcp        0      0 172.21.142.66:49456     47.246.12.254:443       TIME_WAIT   -
其他-程序分析

查询命令

命令 使用方式 常用参数
strace 分析函数调用 -p 进程号
-f -p 9085 -T -tt -e fdatasync
lsof List Open Files的缩写 -p 1234 列出进程id为1234的进程所打开的文件
-i:8080 查看8080端口的程序进程号
-c php-fpm 查看php-fpm进程现在打开的文件
+D /tmp 显示所有在/tmp目录下打开的文件进程
-d 4 显示FD为4的进程
-l 4 显示ipv4协议相关的进程情况
-u^root 显示不是root账户的进程的文件使用 情况
-i -U 查看所有打开的端口和UNIX domain文件
/somedir/ 查看谁在使用文件系统
dmesg 显示linux信息
注:包括一些内核异常信息的日志,有时候排查问题找不到思路的时候,这个指令有奇效
 
journalctl 显示自启动的服务日志 -xe -u kubelet

模拟命令

命令 使用方式 常用参数
nslookup 域名分析  
dig DNS解析 +trace +nodnssec +trace表示开启跟踪查询# +nodnssec表示禁止DNS安全扩展

参考文档

TCP 重传、滑动窗口、流量控制、拥塞控制

eBPF 介绍 & eBPF - Introduction