1、寻找某个目录下,大于1个G的文件
find 路径 -参数 | xargs 执行命令
-type 文件类型,d目录,f一般文件
-size 文件大小
-name 文件名正则
#查看大文件(超过1G)
find / -type f -size +1024M | xargs ls -al
2、查看CPU运行状态
vmstat命令
# vmstat 2 3 表示时间间隔2秒,采样3次
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 8 247512 39660 394168 0 0 31 8 86 269 0 1 98 1 0
0 0 8 247480 39660 394172 0 0 0 0 96 147 4 0 96 0 0
0 0 8 247484 39660 394172 0 0 0 66 95 141 2 2 96 0 0
字段说明:
Procs(进程)
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存)
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间
wa: 等待IO时间
iostat命令
用来动态监视系统的磁盘活动以及io负载,包括CPU空闲百分比、CPU用于IO的百分比…
# iostat -c
Linux 5.11.0-25-generic (isdusvr-node1) 08/13/2021 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
6.06 0.00 5.01 0.04 0.00 88.88
uptime命令
uptime 命令是监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况。
# uptime
05:38:26 up 1:47, 2 users, load average: 0.12, 0.08, 0.08
输出结果中,各个数据所代表的含义依次是:系统当前时间、系统运行时长、当前登陆系统的用户数量、系统分别在 1 分钟、5 分钟和 15 分钟内的平均负载。
这里需要注意的是,load average 这 3 个输出值一般不能大于系统 CPU 的个数。例如,本测试系统有 8 个 CPU,如果 load average 中这 3 个值长期大于 8,就说明 CPU 很繁忙,负载很高,系统性能可能会受到影响;如果偶尔大于 8 则不用担心,系统性能一般不会受到影响;如果这 3 个值小于 CPU 的个数(如本例所示),则表示 CPU 是非常空闲的。
top命令
能够实时显示系统中各个进程的资源占用状况,包括CPU使用、内存使用和执行时间。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3758 root 20 0 4118404 502364 10484 S 19.9 8.3 2115:43 java
3997 root 20 0 3699836 359484 10360 S 4.3 5.9 495:46.65 java
top -Hp pid
定位到线程
jstack -l pid
查看进程堆栈快照
ps命令
常用的参数有-aux、-ef、-u
# ps -aux|grep nacos
root 3758 1 18 Aug06 ? 1-11:16:24 java -jar ...
用户ID 进程ID 父进程ID 命令的名称和参数
# ps -aux|grep nacos
root 3758 18.5 8.2 4118404 502364 ? Sl Aug06 2116:25 java -jar ...
进程ID 占用CPU 占用内存 虚拟內存量(KB) 固定內存量(KB)
10、oom如何排查
堆溢出
1.查找关键报错信息,如
java.lang.OutOfMemoryError: Java heap space
2.使用内存分析工具(VisualVM
)对Dump出来的堆储存快照进行分析,分析清楚是内存泄漏还是内存溢出。
3.如果是内存泄漏
,可进一步通过工具查看泄漏对象到GC Roots的引用链,修复应用程序中的内存泄漏。
4.如果是内存溢出
,先检查代码是否有死循环,递归等,再考虑用 -Xmx 增加堆大小。
栈溢出
- 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出
StackOverflowError
异常,检查是否递归调用方法 - 如果无法申请到足够的内存时,会抛出
OutOfMemoryError
异常,检查是否有死循环创建线程等,通过-Xss降低的每个线程栈大小的容量
方法区溢出
运行时产生大量的类
,会填满方法区,造成溢出。
- 检查是否方法区空间设置得过小
- 检查是否使用CGLib生成了大量的代理类
- 检查是否跟jsp有关
- 重启大法,重启JVM
直接内存溢出
直接内存溢出原因
- 本机直接内存的分配虽然不会受到Java 堆大小的限制,但是受到
本机总内存大小
限制。 - 直接内存由 -XX:MaxDirectMemorySize 指定,如果不指定,则默认与Java堆最大值(-Xmx指定)一样。
NIO
程序中,使用ByteBuffer.allocteDirect(capability)
分配的是直接内存,可能导致直接内存溢出。
直接内存溢出排查
- 检查代码是否恰当
- 检查JVM参数-Xmx,-XX:MaxDirectMemorySize 是否合理。
1、jvm排查
-
jps
查看java进程的pid -
jstat -gc pid
查看年轻代、老年代等区域空间占用,gc次数 -
jmap -heap pid
查看堆信息jmap -dump:format=b,file=test.hprof pid
导出堆内存文件,用visualvm工具
导入该dump文件分析,可查看对象实例数及其大小 -
jstack -l pid
查看进程堆栈快照
3、挂载
Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。
因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。
如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。
挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
4、链接(硬链接和软链接)文件
文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode (i 节点)信息;剩余的大部分用于保存 block 信息。
inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。
block 的大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
由此,我们可以知道以下 2 个重要的信息:
- 每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;
- 如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块;
ln 命令用于给文件创建链接,根据 Linux 系统存储文件的特点,链接的方式分为以下 2 种:
-
软链接:也称符号链接,类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录。
-
硬链接:我们知道,文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。
硬链接文件有两个限制
1)、不允许给目录创建硬链接;
2)、只有在同一文件系统中的文件之间才能创建链接,而且只有超级用户才有建立硬链接权限。
# ln [选项] 源文件 目标文件
-s:建立软链接文件。如果不加 "-s" 选项,则建立硬链接文件;
-f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;
5、Linux命令执行过程
1) 判断路径
判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话直接执行。
2) 检查别名
Linux 系统会检查用户输入的命令是否为“别名命令”。要知道,通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。
3) 判断是内部命令还是外部命令
Linux命令行解释器(又称为 Shell)会判断用户输入的命令是内部命令还是外部命令。其中,内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令都是外部命令,这些命令交给步骤四继续处理。
内部命令由 Shell 自带,会随着系统启动,可以直接从内存中读取;而外部命令仅是在系统中有对应的可执行文件,执行时需要读取该文件。
4) 查找外部命令对应的可执行文件
当用户执行的是外部命令时,系统会在指定的多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置,也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户“找不到此命令”)。
6、Vim
三种模式
操作命令
-
删除文本
快捷键 功能描述 dd 删除光标所在行 ndd 删除当前行(包括此行)后 n 行文本 dG 删除光标所在行一直到文件末尾的所有内容 D 删除光标位置到行尾的内容 :a1,a2d 函数从 a1 行到 a2 行的文本内容 -
查找文本
快捷键 功能描述 /abc 从光标所在位置向后查找字符串 abc /^abc 查找以 abc 为行首的行 /abc$ 查找以 abc 为行尾的行 n 向同一方向重复上次的查找指令 N 向相反方向重复上次的查找指定 -
替换文本
快捷键 功能描述 r 替换光标所在位置的字符 R 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束 ?/a1/a2/g 将当前光标所在行中的所有 a1 用 a2 替换 :n1,n2s/a1/a2/g 将文件中 n1 到 n2 行中所有 a1 都用 a2 替换 :%s/a1/a2/g 将文件中所有的 a1 都用 a2 替换
7、文本处理命令
7.1 cat命令
连接文件并打印输出到标准输出设备
cat [选项] 文件名
或者
cat file1 file2 > file3 # 将file1和file2合并至file3
-n 对输出的所有行进行编号;
-b 同 -n 不同,此选项表示只对非空行进行编号。
-s 当遇到有连续 2 行以上的空白行时,就替换为 1 行的空白行。
cat > index.html << EOF # 输入index.html并用EOF字符结尾
7.2 head、tail命令
head -n 30 file1 #输出头部30行
tail -n 30 file1 #输出尾部30行
tail -f file1 #不断刷新新内容
7.3 grep命令
使用正则表达式搜索文本,并把匹配的行打印出来
grep [选项] 模式 文件名
grep -n '^abc' file1
-c 仅列出文件中包含模式的行数。
-i 忽略模式中的字母大小写。
-n 在每一行的最前面列出行号。
-v 排除这种模式
7.4 sed命令
sed [选项] [脚本命令] 文件名
sed -i 's/abc/aaa/' file1
-n 屏蔽输出
-i 直接修改源文件
7.5 awk命令
awk [选项] '匹配规则{执行命令}' 文件名
$0 代表整个文本行;
$1 代表文本行中的第 1 个数据字段;
$2 代表文本行中的第 2 个数据字段;
$n 代表文本行中的第 n 个数据字段。
awk 程序读取文本文件,只显示第 1 个数据字段的值:
# cat data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.
# awk '{print $1}' data2.txt
One
Two
Three
# echo "My name is Rich" | awk '{$4="Christine"; print $0}'
My name is Christine
7.6 sort
-u 去除重复行
-r 逆序
-n 以数值来排序
-o 将排序结果输出到文件
-t -k -t指定分隔符,-k指定第几列
8、输入输出重定向
输入重定向
命令符号格式 | 作用 |
---|---|
命令 < 文件 | 将指定文件作为命令的输入设备 |
命令 << 分界符 | 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串 |
命令 < file1 > file2 | 将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中。 |
输出重定向
0,STDIN_FILENO,标准输入(一般是键盘)
1,STDOUT_FILENO,标准输出(一般是显示屏,准确的说是用户终端控制台)
2,STDERR_FILENO,标准错误(出错信息输出)
命令符号格式 | 作用 |
---|---|
命令 > 文件 | 将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。 |
命令 2> 文件 | 将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。 |
命令 >> 文件 | 将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。 |
命令 2>> 文件 | 将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。 |
命令 >> 文件 2>&1 或者 命令 &>> 文件 | 将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。 |
9、读写执行权限
r(100) w(010) x(001)
权限 | 对文件的作用 |
---|---|
读权限(r) | 表示可读取此文件中的实际内容 |
写权限(w) | 表示可以编辑、新增或者修改文件中的内容 |
执行权限(x) | 表示该文件具有被系统执行的权限 |
权限 | 对目录的作用 |
---|---|
读权限 | 表示具有读取目录结构列表的权限,可以看到目录中有哪些文件和子目录。可以在此目录下执行 ls 命令,查看目录中的内容。 |
写权限 | 在此目录中建立新的文件或子目录;删除已存在的文件和目录(无论子文件或子目录的权限是怎样的);对已存在的文件或目录做更名操作;移动此目录下的文件和目录的位置。一旦对目录拥有 w 权限,就可以在目录下执行 touch、rm、cp、mv 等命令。 |
执行权限 | 目录是不能直接运行的,对目录赋予 x 权限,代表用户可以进入目录,也就是说,赋予 x 权限的用户或群组可以使用 cd 命令。 |
11、测试磁盘IO性能
-
dd命令
读取、转换、输出数据
-
fio命令
可以测试顺序读写、随机读写
12、ssh参数
ssh -D/ssh -L/ssh -R:SSH命令的三种代理功能
正向代理(-L):相当于 iptable 的 port forwarding,在本地启动端口,把本地端口数据转发到远端。
用法1:远程端口映射到其他机器
HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行:
HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC
用法2:本地端口通过跳板映射到其他机器
HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行:
HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC user@HostB
反向代理(-R):相当于 frp 或者 ngrok,远端启动端口,把远端端口数据转发到本地
HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:
HostA$ ssh -R HostC:PortC:HostB:PortB user@HostC
socks5 代理(-D):相当于 ss/ssr,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机
在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:
HostA$ ssh -D localhost:1080 HostB
13、lsof
lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息。
lsof | grep deleted
可找出系统所有的被打开且已删除的文件
lsof -i:端口号
可以获得所有在指定端口号上打开的文件
lsof -p PID
某进程打开的文件
14、du df
df -hT # 查看磁盘空间占用
-------
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 594M 1.7M 592M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 125G 22G 97G 19% /
tmpfs tmpfs 2.9G 0 2.9G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/sda2 ext4 976M 366M 543M 41% /boot
tmpfs tmpfs 594M 4.0K 594M 1% /run/user/0
tmpfs tmpfs 594M 4.0K 594M 1% /run/user/1000
du -hs ./* # 查看文件大小
-------
4.0K ./15_140
45M ./isdusvr-admin.jar
12K ./isdusvr-admin.log
67M ./isdusvr-auth.jar
27M ./isdusvr-auth.log
15、netstat
用于显示 tcp,udp 的端口和进程等相关情况。
netstat -tunlp | grep 端口号
- -t (tcp) 仅显示tcp相关选项
- -u (udp)仅显示udp相关选项
- -n 拒绝显示别名,能显示数字的全部转化为数字
- -l 仅列出在Listen(监听)的服务状态
- -p 显示建立相关链接的程序名
Comments | 0 条评论