如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情
在 Linux 系统中,存在一个独特的特性,即 “一切皆文件”。这意味着无论是普通文件,还是目录,都能够采用管理文件的方式来进行操作和管理。那么,当遇到一些问题时,比如文件过大从而占用了大量磁盘空间,或者是小文件数量过多进而占用了大量 inode 号,我们该如何去排查这些情况呢?
目录
💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!
👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!
🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对Linux感兴趣的朋友,让我们一起进步,共同提升!
一、磁盘相关案例
案例一、由于进程占用大量的内存导致系统出现oom报错信息
1.由于进程占用大量的内存导致系统出现oom报错信息
oom内存溢出:会导致系统杀死占用内存最高的进程
导致内存飙升的原因:
1).由于大量的用户访问 正常现象 增加内存即可解决
2).开发写的程序错误导致(java)找开发解决问题
3).由于网络波动导致内存升高 增加swap解决
4).其他原因:内存测试,拷贝,压力测试...
解决方法总结:
外部原因:增加内存
内部原因:代码 个人操作 使用swap解决
swap:磁盘划分的分区充当内存使用,在内存不够时,临时充当内存使用,目的就算为了解决oom内存溢出
swap可以在磁盘分区的时候进行划分
swap大小:内存的1-1.5倍,如果内存大于8G,最多给swap8G
还可以在安装完操作系统后进行划分
磁盘分区:
/boot
swap 2G #磁盘速度比内存慢很多 狗骑兔子和高铁的区别
/
企业分区:
/boot
/
案例一.
如何在系统中创建swap分区:
查看swap分区的大小:
[root@yunzhongziedu ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 312M 120M 9.5M 1.5G 1.4G
Swap: 2.0G 0B 2.0G
1.生成一个2G空间的文件
[root@yunzhongziedu ~]# dd if=/dev/zero of=/tmp/2g bs=1M count=2000
[root@yunzhongziedu ~]# ll -h /tmp/2g
-rw-r--r-- 1 root root 2.0G Mar 27 17:44 /tmp/2g
2.格式化为swap分区
[root@yunzhongziedu ~]# mkswap /tmp/2g
Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=448c7af1-7919-4201-b02e-dd5a0c3c775a
3.激活swap空间(挂载到源swap基础上)
[root@yunzhongziedu ~]# swapon /tmp/2g
swapon: /tmp/2g: insecure permissions 0644, 0600 suggested.
4.查看是否成功
[root@yunzhongziedu ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 238M 104M 9.5M 1.6G 1.5G
Swap: 4.0G 0B 4.0G #原有2G,变为4G成功
5.查看swap分区组成
[root@yunzhongziedu ~]# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 2097148 0 -2 #原有的swap分区
/tmp/2g file 2047996 0 -3 #临时挂载的swap分区()
6.卸载swap分区
[root@yunzhongziedu ~]# swapoff /tmp/2g
查看:
[root@yunzhongziedu ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 237M 105M 9.5M 1.6G 1.5G
Swap: 2.0G 0B 2.0G #卸载成功
案例二、磁盘爆满,如何查找大文件
案例二.磁盘爆满,如何查找大文件#(慎重删除!!搞懂干啥的)
方法1.find
[root@yunzhongziedu ~]# find / -type f -size +100M
/proc/kcore
方法2.du
[root@yunzhongziedu ~]# du -h / |awk '$1 ~ /G$/'
案例三、inode满,如何查找小文件
案例三.inode满,如何查找小文件
通过目录查找,小文件越多目录越大
[root@yunzhongziedu ~]# mkdir yunzhongzi
[root@yunzhongziedu ~]# touch ./yunzhongzi/{1..100000}.txt
-bash: /usr/bin/touch: Argument list too long #太长了,不让创建,建个小点的
[root@yunzhongziedu ~]# touch ./yunzhongzi/{1..10000}.txt #1万个
[root@yunzhongziedu ~]# ll -h
total 396K
drwxr-xr-x 2 root root 240K Mar 27 18:03 yunzhongzi #才240k
ot@yunzhongziedu ~]# find / -type d -size +200k
/root/yunzhongzi
案例四、磁盘满通过增加磁盘的方式解决
1.插入4T磁盘
2.格式化
3.挂载到/data
4.文件被占用,磁盘空间不释放
[root@yunzhongziedu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 18G 14G 4.4G 76% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
5.将大文件移动到/data目录并做软链接
[root@yunzhongziedu ~]# mv /var/log/1.log /data/
[root@yunzhongziedu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 18G 3.7G 15G 21% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb 4.0T 9.8G 3.9T 1% /data
[root@yunzhongziedu ~]# ln -s /data/1.log
[root@yunzhongziedu ~]# ll
total 476
lrwxrwxrwx 1 root root 11 Mar 27 19:21 1.log -> /data/1.log
drwxrwxrwx 2 500 500 4096 Mar 27 18:54 cmatrix-1.2a
-rw-r--r-- 1 root root 74376 Apr 1 2002 cmatrix-1.2a.tar.gz
drwxr-xr-x 2 root root 245760 Mar 27 18:03 yunzhongzi
[root@yunzhongziedu ~]# ll -h /data/1.log
-rw-r--r-- 1 root root 9.8G Mar 27 19:15 /data/1.log
案例五、文件被占用,磁盘空间不释放
1.生成一个10G的大文件
[root@yunzhongziedu ~]# ll -h /data/1.log
-rw-r--r-- 1 root root 9.8G Mar 27 19:15 /data/1.log
2.模拟文件被调用
[root@yunzhongziedu ~]# tail /data/1.log
3.进入到/data目录删除1.log
[root@yunzhongziedu data]# rm -rf 1.log
发现磁盘进程依然存在
[root@yunzhongziedu data]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 18G 3.7G 15G 21% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb 4.0T 9.8G 3.9T 1% /data
这如何解决呢?
通过lsof命令查找被哪个进程所调用
[root@yunzhongziedu ~]# lsof |grep 1.log
vim 1551 root 3r REG 8,16 10485760000 67 /data/1.log (deleted) #采用tail直接被删除,用vim打开
[root@yunzhongziedu ~]# kill 1551 杀死进程
Terminated #第二页面被迫退出
[root@yunzhongziedu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 18G 3.7G 15G 21% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb 4.0T 33M 4.0T 1% /data # 结束进程后磁盘释放
过滤进程信息,取消显示本身进程号
[root@db01 ~]# ps axu|grep test.txt
root 15655 0.1 0.2 149520 5248 pts/0 S+ 15:08 0:00 vim test.txt
root 15735 0.0 0.0 112808 972 pts/1 S+ 15:09 0:00 grep --color=auto test.txt
[root@db01 ~]# ps axu|grep test.txt|grep -v grep
root 15655 0.1 0.2 149520 5248 pts/0 S+ 15:08 0:00 vim test.txt
二、kill
1、kill命令
在 Linux 系统中,kill命令用于向进程发送信号,通常用于终止进程。
基本语法
kill [选项] <进程号>
常用选项:
-l:列出所有可用的信号名称。
-9:强制杀死进程(发送 SIGKILL 信号)。
-15:默认的终止信号(发送 SIGTERM 信号),这是比较 “温和” 的终止方式,允许进程在终止前进行一些清理操作。
注意事项
谨慎使用-9选项
强制杀死进程(-9)可能会导致数据丢失或文件损坏,因为进程没有机会进行清理操作。只有在正常终止(-15)无效时才考虑使用。
信号的作用
Linux 系统中有很多不同的信号,每个信号都有特定的作用。例如,SIGHUP(1)信号通常用于通知进程重新读取配置文件,SIGINT(2)信号类似于在终端中按Ctrl + C来中断进程。kill命令可以发送这些不同的信号来控制进程的行为。
总之,kill命令是 Linux 系统管理中非常重要的工具,用于有效地控制和管理正在运行的进程。
2、kill的进阶
killall需要安装才可使用
yum -y install psmisc
pkill pid号码 #杀死某个进程
killall nginx #杀死所有名为nginx的进程
pkill nginx #杀死所有名为nginx的进程
三、进程
1、进程的概述
1.什么是进程?
当运行一个程序,那么将这个运行的程序叫做进程
PS1:当程序运行为进程后,系统会为该进程分配内存,以及进行运行的身份和权限
PS2:在进程运行过程中,服务器上会有各种状态来表示当前进程的指标信息
2.程序的进程的区别
程序是数据和指令的集合,是一个静态的概念,可以长期存在系统中
进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中
3.程序的生命周期
一个对象从无到有,从有到无的过程称为生命周期
当父进程收到任务调度的时候,会通过fock派生子来处理,子进程会继承父进程的信息
1).子进程在处理任务代码时,父进程会进入等待状态中
2).子进程在处理任务代码时,会执行退出,然后由父进程回收子进程的资源
3).如果子进程在处理任务时,父进程退出,子进程没有退出,子进程未被父进程管理,则变为僵尸进程
4).每个进程都有自己的PID号,子进程称为PPID
2、监控进程的状态
程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为静态和动态
1.使用ps命令查看当前进程状态(静态)
ps -aufx常用组合方式查看进程、PID、占用CPU百分比,占用内存百分比,状态和执行的命令等
-a #显示所有终端机下执行的进程,除了现阶段作业领导者除外
-u #以用户为主的格式来显示进程状况
-x #显示所有进程,不以终端机区分
-f #用ASCII字符显示树状结构,表达进程间的关系
[root@yunzhongziedu ~]# ps axuf
标志 | 意义 |
---|---|
USER | 该process属于哪个使用者账号的 |
PID | 该process的号码 |
%CPU | 使用的CPU资源所占百分比 |
%MEM | 使用的物理磁盘百分比 |
VSZ | 使用的虚拟内存量 |
RSS | 占用的固定内存量 |
TTY | 显示在哪一个终端机上运行,若与终端机无关则显示 ?若为pts/0等的,则表示为由网络链接仅主机的程序 |
STAT | 该程序目前的状态 |
SATRT | 被触发启动的时间 |
TIME | 实际使用CPU运作的时间 |
COMMAND | 该程序的实际指令内核态进程无用户进程 |
STAT基本状态 | 描述 | STAT状态+符号 | 描述 |
---|---|---|---|
R | 进程运行 | s | 进程是控制进程,Ss进程的领导者,父进程 |
S | 可中断睡眠 | < | 进程运行在最高优先级上,S<优先级较高的进程 |
T | 进程被暂停 | N | 进程运行在低优先级上,SN优先级较低的进程 |
D | 不可中断睡眠 | + | 当前进程运行在前台,R+表示该进程在前台运行 |
z | 僵尸进程 | 1 | 进程是多线程的,SI表示进程是以线程方式运行 |
案例1:
1).在终端1上运行vim
[root@yunzhongziedu ~]# vim test.txt
2).在终端2上运行ps命令查看状态
[root@yunzhongziedu ~]# ps aux|grep test.txt
root 1630 0.0 0.2 149508 5224 pts/0 S+ 21:55 0:00 vim test.txt
root 1632 0.0 0.0 112808 976 pts/1 R+ 21:55 0:00 grep --color=auto test.txt
3).在终端1上再次挂起vim命令按下ctrl+z
4).回到终端2再次运行ps命令查看状态
[root@yunzhongziedu ~]# ps aux|grep test.txt
root 1630 0.0 0.2 149508 5224 pts/0 T 21:55 0:00 vim test.txt #T表示停止状态
root 1634 0.0 0.0 112808 972 pts/1 R+ 21:56 0:00 grep --color=auto test.txt
案例2:
ps命令查看不可中断状态进程
使用tar打包时,可以通过中断不断的查看状态,#(状态由S+,R+变为D+)手速不够,借用
root@lzy ~]# ps axu|grep tar|grep -v grep
root
14289 2.6 0.1 124268 1888 pts/2
S+ 10:56 0:01 tar zcf
etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root
14289 2.7 0.2 124380 2240 pts/2
R+ 10:56 0:01 tar zcf
etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root
14289 2.9 0.2 124916 2724 pts/2
D+ 10:56 0:01 tar zcf
etc.tar.gz /etc/ /usr/ /var
3、top命令
什么是中断?
中断就是终止当前在做的事情去执行另一件事,保留现场,执行完成之后会回来执行刚刚未完成的的部分
1.可以使用top命令来查看当前的进程状态(动态)
top - 22:02:53 up 3:00, 2 users, load average: 0.02, 0.05, 0.05
Tasks: 106 total, 2 running, 103 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 6.7 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2027868 total, 1565792 free, 177972 used, 284104 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1697620 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 43836 4144 2548 S 0.0 0.2 0:03.97 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
任务 | 含义 |
---|---|
Tasks: 106 total | 当前进程总数 |
1 running | 正在运行的进程数 |
104 sleeping | 睡眠的进程数 |
1 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
%Cpu(s): 0.0 us, | 系统用户进程使用CPU百分比 |
0.7 sy | 内核进程占用CPU百分比,内核是与硬件进行及交互 |
0.0 ni, | 改变过优先级的进程占用CPU百分比 |
99.3 id | 空闲CPU的百分比 |
0.0 wa | CPU等待IO完成的时间 |
0.0 hi | 硬中断,占CPU百分比 |
0.0 si | 软中断,占CPU百分比 |
0.0 st | 虚拟机占用物理CPU的时间 |
软中断和硬中断的区别
软中断 | 硬中断 | |
---|---|---|
是否有随机性 突发性 | 否 | 是 |
是否有中断相应周期 | 无 | 是 |
中断类型号的提供方法 | 固定或由指令提供 | 由中断控制器提供 |
4、管理进程状态
当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们就可以使用Linux的kall命令对进行发送关闭信号,当然,除了kill还有killall和pkill
1.列出kill在当前系统所支持的信号
[root@yunzhongziedu ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
虽然信号很多,但常用的只有3个
1).SIGHUP 重新加载配置文件 1
2).SIGKILL 强制杀死进程 9
3).SIGTERM 终止进程,默认kill使用该信号 15
下载 Nginx
yum -y install nginx
[root@yunzhongziedu ~]# ps axu|grep nginx #(虚拟机为单U单核)
root 1710 0.0 0.0 39312 936 ? Ss 22:29 0:00 nginx: master process /usr/sbin/nginx
nginx 1711 0.0 0.0 39700 1560 ? S 22:29 0:00 nginx: worker process
root 1721 0.0 0.0 112808 968 pts/1 R+ 22:30 0:00 grep --color=auto nginx
1.发起重载信号,nginx配置文件发生改变,可用此重新加载
[root@yunzhongziedu ~]# kill -1 1710
[root@yunzhongziedu ~]# ps axu|grep nginx
root 1710 0.0 0.0 39436 2004 ? Ss 22:29 0:00 nginx: master process /usr/sbin/nginx
nginx 1723 0.0 0.0 39840 1956 ? S 22:33 0:00 nginx: worker process
root 1725 0.0 0.0 112808 964 pts/1 R+ 22:33 0:00 grep --color=auto nginx
2.发送停止信号
[root@yunzhongziedu ~]# kill 1710
[root@yunzhongziedu ~]# ps axu|grep nginx
root 1730 0.0 0.0 112808 964 pts/1 R+ 22:37 0:00 grep --color=auto nginx #发现子进程还在运行
3.强制终止服务
[root@lzy ~]# kill -1 15688
[root@lzy ~]# ps axu|grep nginx
nginx 15692 0.0 0.3 89376 3648 ? S 12:19 0:00 nginx:
worker process
root 15722 0.0 0.0 112660 968 pts/3 R+ 12:20 0:00 grep --color=auto nginx #借用(单核的,父子进程全部被杀了)
2.killall和pkill
[root@yunzhongziedu ~]# killall nginx #killall+要杀死的进程
[root@yunzhongziedu ~]# ps axu|grep nginx
root 1813 0.0 0.0 112808 968 pts/1 R+ 22:44 0:00 grep --color=auto nginx
[root@yunzhongziedu ~]# pkill nginx #pkill+要杀死的进程
[root@yunzhongziedu ~]# ps axu|grep nginx
root 1832 0.0 0.0 112808 968 pts/1 R+ 22:45 0:00 grep --color=auto nginx
5、管理后台进程
1.什么是后台进程?
运行的进程默认在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
2.如何把程序防在后台?
#把进程放在后台:使用&
[root@yunzhongziedu ~]# sleep 10 &
[2] 1835
[1] Done sleep 10
#把进程挂起放在后台
[root@yunzhongziedu ~]# sleep 4000
^Z[2] Done sleep 10
[3]+ Stopped sleep 4000
#jobs显示在后台运行的程序
[root@yunzhongziedu ~]# jobs
[3]+ Stopped sleep 4000
#让作业3在后台运行
[root@yunzhongziedu ~]# bg %3
[3]+ sleep 4000 &
#将作业4调回前台运行
[root@yunzhongziedu ~]# fg %4
sleep 3000
#终止PID为3的进程
[root@yunzhongziedu ~]# kill %3
[root@yunzhongziedu ~]# jobs
[3]+ Terminated sleep 4000
6、screen命令
1.安装screen #yum -y install screen
2.进入到screen子shell中 #screen -S wget 在screen里面执行命令
[root@yunzhongziedu ~]# screen -S wget_jenkins
[root@yunzhongziedu ~]# wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm
--2024-03-27 22:58:50-- https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm
Resolving pkg.jenkins.io (pkg.jenkins.io)... 151.101.90.133, 2a04:4e42:15::645
Connecting to pkg.jenkins.io (pkg.jenkins.io)|151.101.90.133|:443... connected.
ERROR: cannot verify pkg.jenkins.io's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
Issued certificate has expired.
To connect to pkg.jenkins.io insecurely, use `--no-check-certificate`.
[root@yunzhongziedu ~]# exit
[screen is terminating]
3.ctrl a+d #平滑退出
4.screen -list #查看后台的screen
[root@yunzhongziedu ~]# screen -S wget_jenkins
[root@yunzhongziedu ~]# screen -list
There is a screen on:
1875.wget_jenkins (Attached)
1 Socket in /var/run/screen/S-root.
使用screen -r id号或者名称进入
nohup使用方法
nohuo 可执行命令 &
公司自己研发的py:
nohup python3.5 test.py &
注意: 在运行命令的目录自动生成一个nohup.out文件
7、进程的优先级
1.在进程启动时,为不同的进程使用不同的策略
nice值越高,表示优先级越低,
nice值越低,表示优先级越高
修改时可以同时修改RP -20映射到0,+19映射到39
2.nice指定程序的优先级,语法格式nice -n优先级数字 进程名称
磁盘管理的分享到此结束,明日预告,网络知识,dns解析,tcp3次握手~~~~
想成为大佬,就要从小白开始,从0开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~~