title: Linux性能分析
date: 2018-12-15 11:16:27
tags:
- 基础
categories:
- Linux
💠
💠 2024-06-01 15:50:01
目的:通过一致的工具及配置,跑不同的测试工具,看性能表现,对比不同设备间性能差异
高负载测试
占满CPU
简易评测
time echo "scale=9000; 4*a(1)" | bc -l -q
系统实时状态信息
top
htopHtop更好用
gotop
ytop
ctop
Glances 信息全面 资源消耗大些
nmon
uptime
执行结果
cat /proc/loadavg
常规: 单核:平均负载0.7以下是安全的,大于就需要优化了,多核则是 0.7*N(核心数)
从源码看Load计算方式
lm-sensors
CPU等硬件温度等信息检测 参考
vector CPU-X | Github:repo
简洁而详细
输出解析
used
内存已使用量(不含buff/cache), free
空闲内存, available
可用内存buffers
是为了写时,解决内存和硬盘巨大速度差存在的缓冲区(块设备IO相关的缓存页)cache
是为了读时,为了尽量减少内存从硬盘读数据的次数,缓冲区(普通文件相关的缓存页)cached
就是cache内存区域已经使用量
- 注意: 如果是新版的free, shared 那一栏总是为0, 因为shared本就是说明进程共享内存容量, free认为不能显示数有效信息, 就抛弃了这个指标,总是显示为0
较精准展示进程使用的内存和swap内存
通过各类软件的输出,快速定位问题点
工程化管理多个Linux主机
arch: yay linux-tools 选择 perf 进行安装
FlameGraph
结合使用
来源 procps, 用于查看 进程详细信息, CPU占用率 内存 网络等...
Report memory usage with shared memory divided proportionally.
Report virtual memory statistics
最初是设计为查看虚拟内存的,现在常用于性能监测
vmstat 1 4
输出信息,间隔1s 共4次 特别注意第一行数据是指开机以来的平均值,后面的才是当前值
更多参数用法:
-a
输出中,原来的 buff 和cache 被 inact 和 active 取代了
-f
查看启动以来创建的fork(或者称为task)总数-m
展示内存 slabinfo-s
展示内存指标以及系统事件-d
展示各磁盘的统计信息-p /dev/sda1
展示某一特定分区的 IO信息对多处理器的统计, 和iostat同属于systat软件下,可能需要手动安装
mpstat -P ALL 1 1
查询所有CPU信息,后两个参数是和vmstat一样的, 如果只看0号CPU 就ALL改成0即可
-I
值可选, SUM CPU ALL执行iostat
输出信息:
参数:
iostat -d -k 1 3
-y
可以去除第一行按程序名字找到id
ps -ef | grep "$NAME" | grep -v "grep" | awk '{print $2}'
find the process ID of a running program
pidof sshd
pidof -x 脚本文件名
-o pid
pgrep, pkill - look up or signal processes based on name and other attributes
进程
Collect, report, or save system activity information.
需要安装和启动 sysstat 服务 才能使用
默认持续执行除非Ctrl C退出,指定参数后就和vmstat一样 sar 2 3
输出到指定文件中: -o filename
注意这个不是文本结构,是特殊的结构化方式, 查看需要 sar -f filename
多核的支持:sar -P ALL 1 1
与mpstat 大致相同
指定结束时间 -e 18:00:00
一般和 -o -f一起用
查看网络信息 -n 参数有: DEV EDEV SOCK FULL
list open files
这个命令使用时最好使用sudo或者root用户, 不然就会提示因权限问题导致显示信息不全
lsof -d 3
查看打开标准错误输出的进程 (标准错误输出是3) 正在报错的进程
lsof file/dir
查看打开某文件或目录(不关注子文件夹)的进程sudo lsof -p pid
通过进程查询打开的fd
sudo lsof -u username
查看某一用户打开的文件 输出结果说明:
socket使用情况
lsof -Pni
列出所有socket和 netstat -pant
类似
lsof -i [4/6] [protocol][@hostname|hostaddr] [:service|port]
按条件列出所有socket
lsof -i -a -p pid
列出指定进程打开的socketlsof +L1
查看 已删除 但是未被回收磁盘空间的文件见下文删除文件真正删除文件
dd if=/dev/zero bs=1024 count=1000000 of=./1gb.file
df -h
rm -f 1gb.file
再 ls 下能发现文件不见了, 但是对硬盘的占用还在lsof | grep 1gb.file
或者 lsof 1gb.file
就能找到占用该文件的进程了,杀掉就能真正的删除文件了
恢复删除的文件 (前提是仍被其他进程引用)
打开后不退出
找出持有该文件的进程id
less 12008 kcp 4r REG 8,3 40239 4990940 /home/kcp/test/test.log (deleted)
查询持有的文件,找到对应的数字软链接,这里找到的是4
复制回来
identify processes using files or sockets
和 lsof 功能差不多,但 fuser 是符合 POSIX 标准的命令 (POSIX:可移植操作系统接口)
fuser -v /path/to/sdk
列出正在打开这个目录的进程(和lsof一样不关注子文件夹)常用选项
-
重置所有的选项,把信号设置为SIGKILL.fuser -v -n tcp 22
或者 fuser -v 22/tcp
fuser中含三种协议: file 默认, tcp, udp
fuser -v -n tcp 0
fuser -v -k /home/kuang/sdk
会把占用该文件夹的进程全部杀掉 (如果是ssh登录的服务器,当前目录就是这个的话, 会掉线)参考: ps命令输出
输出的信息解释
直接运行 ps
就会显示当前会话中的进程
ps aux
显示系统中所有进程的状态信息 可根据需要自由组合
D
无法中断的休眠状态(通常 IO 的进程);R
正在运行可中在队列中可过行的;S
处于休眠状态;T
停止或被追踪;W
进入内存交换 (从内核2.6开始无效);X
死掉的进程 (基本很少见);Z
僵尸进程;<
优先级高的进程N
优先级较低的进程L
有些页被锁进内存;s
进程的领导者(在它之下有子进程);l
多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);+
位于后台的进程组;ps aux
和ps -aux
的区别:
ps -aux
其实应该理解为 ps -a -u x
显示用户名为 x 的用户的所有进程ps aux
ps aux
ps -aux
ps --format
ps aux
等价于 ps -eF
Debian 上
ps -ef
和ps ef
执行效果不一样
-o
输出指定列 ps -eo pid,user,cmd,start ...
更多需要查看手册 man ps
对范围进行筛选
ps -u root
ps -U root -u root u
ps -C sshd
排序 :
ps aux --sort -pcpu/+pcpu/
按CPU使用率,进行降序/升序排列--sort=+pcpu, -pmem
CPU升序,内存降序排列查询线程信息:
ps -ef | grep mysql
ps -L pid
显示某id的线程的具体信息 其中的LWP (轻量级进程, 可以理解为用户进程) Light Weight Processps -T pid
显示 将-L的LWP替换为SPID (系统中的线程ID)进程树:
ps axjf
ps -ejH
实践
列出Java进程 ps aux | grep RSS | grep -v "grep" && ps aux | egrep -v "grep" | grep -i java
统计所有Java进程的内存 ps aux | grep java | grep -v grep | awk '{sum+=$6};END {print sum "K " sum/1024"M "}'
ps -a -x -o rss,comm | grep java | awk '{sum+=$1};END {print sum "K " sum/1024"M "}'
统计某个用户下进程所有内存 ps -o pid,ppid,pgid,rss,comm -u deployer | awk '{sum+=$4};END {print sum "K " sum/1024"M "}'
统计某个应用进程所有内存(自己和所有子进程)
按内存排序 列出所有进程 ps aux | grep -v RSS | awk "{print $6 "\t" $11 }" | sort --human-numeric-sort -r | less
按实际执行的二进制命令展示 ps -ely
查看进程下的线程 ps huH p pid
Rust 编写的 现代 ps
顾名思义 树状图展示进程 线程关系
kill -l
或者 trap -l
: 输出kill命令可向进程发送的信号
9号无法屏蔽
kill命令格式kill [选项] [进程号]
选项:
进程号:
常用信号量
信号名称 | 信号编号 | 说明 |
---|---|---|
HUP | 1 | 终端会话断开,关闭所有其从属的子进程 |
INT | 2 | 中断 同Ctrl+C 结束前台进程,输入阻塞的程序应该退出(自己做清理)并清除阻塞状态 |
QUIT | 3 | 退出 同Ctrl+\ 也有点强制退出的意思 |
FPE | 8 | 发生算术运算错误时发出 |
KILL | 9 | 强制终止 退出 |
TERM | 15 | 终止 程序自己做清理工作,然后退出 缺省的信号值 |
CONT | 18 | 继续 fg/bg 命令 |
STOP | 19 | 暂停/停止 同 Ctrl+Z
|
中文释义:全部信号
或者直接 man kill
kill -9 pid
Tips
例如 reids的服务端:
- 终结后台作业: 命令格式:
kill -信号 %作业号
作业号就是运行jobs
后方括号内数字- dmesg 可以查看被Kill的进程的日志
通过名字来发送信号,其他和kill是一致的
killall -9 name
要十分谨慎的使用, 避免误杀进程捕捉信号并响应
trap "commands" signal-list
用途
trap "" 2
: 忽略 Ctrl+C
#!/bin/bash
trap 'echo "hello"' 2
tail -f ~/.bashrc
trap "" INT
屏蔽中断信号trap INT
恢复在Linux中, 作业是由一个或多个进程构成的, 作业控制就是对作业的行为进行控制, 前后台的切换, 终止等操作
&
: 让作业后台运行 作业如果是多个命令构成,会返回最后一个命令对应进程的pid和作业号Ctrl Z
切换到后台,但是会暂停的状态,可以使用jobs
查看作业号kill -18 %作业
或者 bg %作业号
fg %作业
指定作业
符号 | 含义 | 示例 |
---|---|---|
%Number | 根据编号来指定作业 | fg %1 |
%String | 匹配命令以String开头的作业,如果匹配到多个就会报错 | kill %deng |
%?String | 命令行中含有String字符串的作业,如果是通过管道连接的多个命令,则仅匹配第一个命令 | kill %?ng |
%% | 指代作业列表中最近一个被切换到后台的作业 | kill %% |
%+ | 和%%作用完全相同 | kill %+ |
%- | 排在%%所指代的作业前面的那个作业 | kill %- |
也就是说,这个匹配也是只能匹配一个作业,不能通配使用
使得普通命令启动的进程变成类似于守护进程的工具
两种方案:
2>&1
表示将标准错误(2)重定向到标准输出(1)nohup 命令>result.txt 2>/dev/null 1>&2 &
wait $PID
echo $?
disown %作业号
就能在后台运行,且屏蔽hup信号了setid 命令
就会让进程在一个新的会话运行在一个真实的终端运行多个伪终端,认为是开启了多个新会话 命令参考
verb | param | comment |
---|---|---|
-A | 将所有的视窗都调整为目前终端机的大小。 | |
-d | <作业名称> | 将指定的screen作业离线。 |
-h | <行数> | 指定视窗的缓冲区行数。 |
-m | 即使目前已在作业中的screen作业,仍强制建立新的screen作业。 | |
-r | <作业名称> | 恢复离线的screen作业。 |
-R | 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。 | |
-s | 指定建立新视窗时,所要执行的shell。 | |
-S | <作业名称> | 指定screen作业的名称。 |
-v | 显示版本信息。 | |
-x | 恢复之前离线的screen作业。 | |
-ls或--list | 显示目前所有的screen作业。 | |
-wipe | 检查目前所有的screen作业,并删除已经无法使用的screen作业。 |
进程间通信: 管道/信号量/共享内存/Socket
uname -a
输出所有信息
who
和 w
who是按照不同tty来显示信息
whoami
查看有效用户,就是当前会话的拥有者
groups
查看所有组
service 服务名 status/start/stop/restart
查看所有service掌控的服务 cd /etc/init.d/ && ls -F
which service
结果显示这是个脚本
service 服务名 stop
等价于 /etc/init.d/服务名 stop
掌控等级制度 LSB
输出机器的 BIOS CPU 内存等硬件信息 (DMTF DMI)
dmidecode -t
就会提示你后接类别Show the status of modules in the Linux Kernel
change root directory 更改root目录 最古老的容器技术
mkdir 目录
复制相关目录过来,就能把系统迁移过来了shutdown | reboot | halt | poweroff | init
命令 | 作用 |
---|---|
shutdown | 可用于关机,重启,支持定时和通知 |
reboot | 重启系统 |
halt | 停止系统 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。