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 个重要的信息:

  1. 每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;
  2. 如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 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 显示建立相关链接的程序名

hhhhh