进程管理:
Linux查看进程的命令如下:
ps命令——查看静态的进程统计信息(一般结合选项使用 ps aux 或 ps -elf 命令)
建议使用 ps -elf 查询,输出的信息更详细些,包括 PPID (对应的父进程 的PID 号)
以上输出信息中,第一行为列表标题,其中各字段的含义描述如下:
USER:启动该进程的用户账号名称;
PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的;
%CPU:CPU占用的百分比;
%MEM:内存占用的百分比;
VSZ:占用虚拟内存(swap 空间)的大小;
RSS:占用常驻内存(物理内存)的大小;
TTY:表明该进程在哪个终端上运行。“ ?” 表示未知或不需要终端;
STAT:显示进程当前的状态,S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程);
START:启动该进程的时间;
TIME:该进程占用的CPU时间;
COMMAND:启动该进程的命令的名称;
top 命令——查看进程动态信息(以全屏交互式的界面显示进程排名,及时跟踪系统资源占用情况)
上述输出信息中,开头的部分显示了系统任务、CPU占用、内存占用等信息,相关信息的含义如下:
系统任务(Task)信息 :total ,总进程数;
running,正在运行的进程数;
sleeping,休眠的进程数;
stopped,中止的进程数;
zombie,僵死无响应的进程数。
CPU占用信息:us,用户占用;
sy,内核占用;
ni,优先级调度占用;
id,空闲CPU;
wa,I/O等待占用;
hi,硬件终端占用;
si,软件中断占用;
st,虚拟化占用。
要了解空闲的CPU百分比,主要看 %id 部分。
内存占用(MEM)信息:total,总内存空间;
free,空闲内存;used,已用内存;
buff / cache,物理内存和交换内存的缓冲区总和。
交换空间(swap) 占用:total,总交换空间;
free,空闲交换空间;
used,已用交换空间;avail Mem,可用物理空间。
pgrep命令——查询进程信息(可以指定进程的一部分名称进行查询,通常结合 “ - l ” 选项)
pstree命令——查看进程树(该命令查询的信息比较复杂,而且之前的命令完全满足我们查询进程信息的需要,所以就略过,通常使用 pstree -aup 或 pstree {用户名} 来使用)
控制进程的相关命令:
执行等待时间较长的进程时,可以在执行命令的最后面加操作符 “&”,进程启动后会直接放入后台运行
Ctrl+z,可以将当前执行的任务调入后台并暂停执行jobs -l 查看当前终端中在后台运行的进程任务,并显示该进程的PID号。
可以使用fg 任务编号(将暂停的进程重新调到前台运行)或 bg 任务编号(将后台暂停执行的任务恢复运行)
终止进程执行
使用 kill 命令终止进程的命令格式: kill PID号 如果无法响应终止信号,可以结合 -9 选项: kill -9 PID号(-9表示强制终止进程,但强制终止会导致程序运行的部分数据丢失,应谨慎使用)
使用 killall 命令终止进程的命令格式:killall 进程名(如 “killall vim”,也可以结合 -9 选项,强制终止,选项格式与kill命令格式一致)
使用 pkill 命令终止进程:可以根据进程的名称,运行该进程的用户,进程所在的终端等多种属性终止特定的进程命令格式与pgrep格式大致相同,也可以加 -9 选项,如:
pkill -9 -U “用户名” -t 指定终端
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:https://www.linuxidc.com/Linux/2019-03/157287.htm
一、进程基础知识
相关定义
程序:二进制文件,静态 /usr/sbin/httpd,/usr/sbin/sshd
进程:是程序运行的过程, 动态,有生命周期的,可以产生和消亡的(进程是已启动的可执行程序的运行实例,实例即运行可执行程序)。
线程:线程是进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程;一个进程至少包括一个线程,通常将该线程称为主线程;一个进程从主线程的执行开始,进而创建一个或多个附加线程,就是所谓基于多线程的多任务.
单线程:消耗资源多,但是线程之间相互没有影响
多线程:消耗资源少,但是线程之间相互影响
进程的生命周期
父进程:程序运行时产生的第一个进程,任何进程都可以作为父进程创建子进程。
子进程:由父进程使用fork()函数完全复制自己的地址空间创建出来的新的进程就是子进程,子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码,随后,子进程可能exec自己的程序代码。
poccess id:为父进程跟踪和安全性以及管理人员的控制和管理所需,父进程会给子进程分配一个唯一的进程id,这个id就是pid
centos5/6:init
centos7:systemd
#yum -y install psmisc
[root@xiaochen proc]# pstree
进程状态
在多任务处理操作系统中,每个CPU(或每个核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU 时间和资源分配的要求会不断变化(进程不会持续的占用cpu,而是根据自己的需求来决定是否需要使用cpu时间),所以进程在运行的时候会有不同的状态,它随着环境要求而改变,具体的状态可以参考下图来看:
一个进程被父进程fork()衍生出来之后,会统一由内核进程调度程序来根据当前这个进程对于cpu的时间和资源的需求来进行调度,如果进程需要使用cpu,那么调度程序会根据当前进程的优先级来进行调度,从而通知进程什么时间会被cpu进行处理。此时进程会处于R状态,R状态包括两种情况,第一种情况是正在排队等待cpu的处理处于Runnable状态,,第二种情况是正在被cpu处理处于running状态;进程在运行的时候可能由用户发出一个stop的状态,从而暂停到后台,这个时候进程就处于T状态;当然进程也可能不需要cpu处理或者是运算或者他本身是一个父进程,有子进程正在工作,这个的时候就会处于sleeping状态;当进程结束工作之后,会释放掉自己的各种资源,然后进入到Z状态,当父进程回收之后就会处于彻底终结的X状态。
进程状态总结:
R状态:包含runnable和running,表示进程正在等待运行或者是正在cpu上运行
Sleeping: 包含S、D、K三种状态
S:可中断睡眠,进程在等待事件触发/接收到指定的信号(硬件请求/系统之间的访问)才会运行起来。
D:不可中断睡眠,不会接收或者是相应外界传来的信号,通常情况下正在进行I/O操作
K:和D的状态相同,但是可以被中断
Stopped:T状态,表示进程被停止,通常是由用户或者是其他进程发送的信号。
Zombie:包含X、Z两种状态
Z:除了pid之外,其他的资源都已经释放掉,给父进程发送退出信号之后进入到Z状态
X:父进程清理掉子进程剩余的结构体之后,子进程就进入到死亡的状态。
二、查看进程
静态ps
[root@xiaochen ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 /usr/lib/systemd/systemd
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存,包括程序、代码、共享库等所有的
RSS: 占用实际内存 驻留内存
TTY: 进程运行的终端,?表示不依赖于任何的终端
STAT: 进程状态
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
START: 进程的启动时间
TIME: 进程占用CPU的总时间,单位是minute
COMMAND: 进程文件,进程名,哪个程序运行的进程
#ps aux --sort %cpu |less 升序排列
#ps aux --sort -%cpu |less 降序排列
#ps -ef
// 自定义显示字段
#ps axo user,pid,ppid,%mem,%command |less
#ps axo user,pid,ppid,%mem,%command --sort-%cpu |less
查看pid
#cat /run/sshd.pid
#ps aux |grep sshd //经常使用的
#pstree //查看进程树
动态top(查看、管理进程)
[root@xiaochen ~]# top
[root@xiaochen ~]# top -d 1 // 一秒钟变化一次
[root@xiaochen ~]# top -d 1 -p 10126 //查看指定的进程的动态信息
[root@xiaochen ~]# top -d 1 -p 10126,131
[root@xiaochen ~]# top -d 1 -u apache //查看指定用户的进程
[root@xiaochen ~]# top -d 1 -u apache -b -n 2 //两次查看apache用户的进程
第一部分:系统整体统计信息
top - 14:22:36 up 4:45, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 206 total, 2 running, 204 sleeping, 0 stopped, 0 zombie
Cpu(s):1.6%us, 0.7%sy, 0.0%ni, 96.8%id, 0.9%wa, 0.0%hi, 0.0%si, 0.0%st
Mem:4019424k total, 1327584k used, 2691840k free, 131012k buffers/cache
Swap:2047992k total, 0k used, 2047992k free, 650880k cached
load average: 0.23, 0.06, 0.02 1分钟,5分钟,15分钟之内cpu的平均负载,数据小于1就是没有过载。0.23除以CPU的个数就是CPU的平均负载。
us:用户占用的cpu的百分比 sy:内核占用的cpu的百分比 ni 改变过优先级的进程占用的cpu的百分比
id:cpu的空闲时间 wa:cpu的IO等待的时间 hi:硬中断占用的cpu的百分比 si:软中断
st:cpu被偷走的时间
PR:优先级
ni:优先级
查看网络进程
ports and services
网络服务是通过socket的方式提供服务的,使用ss命令查询常用的选项
[root@www ~]# ss --help
-n 不解析服务的名字
-a 显示所有套接字
-l 显示监听(Listen)的端口
-t 显示tcp的套接字或者是服务
-u 显示udp的套接字或者是服务
-p 显示进程的名字
1、Show TCP sockets(LISTEN)
[root@www ~]# ss -ant //查看所有状态的,包括监听和建立连接的,此时无需l 选项。
[root@www ~]# ss -ant |grep :22
2、Show UDP sockets(所有状态)
udp的协议比较少
[root@www ~]# ss -anu
注意:netstat命令的用法和ss的用法相同
其他查看进程方式
[root@aliyun ~]# pstree -p
[root@aliyun ~]# atop
[root@aliyun ~]# htop
[root@aliyun ~]# pgrep -l sshd
三、使用信号控制进程 kill,killall,pkill,top
shell管理进程
[root@xiaochen ~]# kill -l //列出所有支持的信号
编号 信号名
1 SIGHUP 重新加载配置
2 SIGINT 键盘中断^C
9 SIGKILL 强制终止,不可忽略,不可拦截
15 SIGTERM 终止(正常退出,干净)默认信号,可忽略
18 SIGCONT 继续,不可拦截
19 SIGSTOP 停止,不可忽略
20 SIGTSTP 暂停^Z
作业1: 给sshd进程发送1信号
[root@xiaochen ~]# ps aux |grep sshd
root 1925 0.0 0.0 64116 44 ? Ss Jul25 0:00 /usr/sbin/sshd
[root@xiaochen ~]# kill -1 1925
[root@xiaochen ~]# ps aux |grep sshd
root 32701 0.0 0.2 64116 1144 ? Ss 19:27 0:00 /usr/sbin/sshd
作业2:给vim进程发送9,15信号
[root@xiaochen ~]# touch file1 file2
[root@xiaochen ~]# tty
/dev/pts/1
[root@xiaochen ~]# vim file1
[root@xiaochen ~]# tty
/dev/pts/2
[root@xiaochen ~]# vim file2
[root@xiaochen ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2
[root@xiaochen ~]# kill 4362
[root@xiaochen ~]# kill -9 4363
作业3:给sshd进程发送18,19信号
[root@xiaochen ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
[root@xiaochen ~]# kill -STOP 5571
[root@xiaochen ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ts 09:35 0:00 /usr/sbin/sshd
[root@xiaochen ~]# kill -cont 5571
[root@xiaochen ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
当sshd进程被终止了,需要使用下面命令把它启动起来
[root@localhost ~]# systemctl start sshd
start:启动
stop:停止
status:查看状态
restart:重新启动
kill 后面加的是进程的pid或者是jobid
killall命令后面可以加进程的name
[root@xiaochen ~]# killall vim //给所有vim进程发送15信号
#pgrep -u named named //查看named用户运行的进程named
#pkill -u alice //可以杀死用户进程
四、进程优先级:
为什么要有进程优先级?
这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来,进程执行占用cpu的能力就是一个必须要可以人为控制的事情。因为有的进程相对重要,而有的进程则没那么重要。
进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时代,都是通过控制进程占用cpu时间的长短来实现的。
就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。
请大家真的不要混淆了系统中的这两个概念:nice(NI)和priority(PR),他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同一个概念。
我们看这个命令:
大家是否真的明白其中PRI列和NI列的具体含义有什么区别?
同样的,如果是top命令:
大家是否搞清楚了这其中PR值和NI值的差别?如果没有,那么我们可以首先搞清楚什么是nice值。
什么是NICE值?
NICE值应该是熟悉Linux/UNIX的人很了解的概念了,它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。
这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。
例如,我们可以通过NICE命令来对一个将要执行的bash命令进行NICE值设置,方法是:
[root@zorrozou-pc0 zorro]# nice -n 10 bash
这样我就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。
我们可以通过nice命令直接查看到当前shell的nice值:
[root@zorrozou-pc0 zorro]# nice
10
对比一下正常情况:
[root@zorrozou-pc0 zorro]# exit
退出当前nice值为10的bash,打开一个正常的bash,我们查看下其 Nice值:
[root@zorrozou-pc0 zorro]# bash
[root@zorrozou-pc0 zorro]# nice
7.0
另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值,具体方法我就不多说了,大家可以参阅相关man page。
需要大家注意的是,我在这里都在使用nice值这一称谓,而非优先级(priority)这个说法。
nice值虽然不是priority,但是它确实可以影响进程的优先级。
在英语中,如果我们形容一个人nice,那一般说明这个人的人缘比较好。什么样的人人缘好?往往是谦让、有礼貌的人。
比如,你跟一个nice的人一起去吃午饭,点了两个一样的饭,先上了一份后,nice的那位一般都会说:“你先吃你先吃!”,这就是人缘好,这人nice!但是如果另一份上的很晚,那么这位nice的人就要饿着了。
这说明什么?
越nice的人抢占资源的能力就越差,而越不nice的人抢占能力就越强。这就是nice值大小的含义,nice值越低,说明进程越不nice,抢占cpu的能力就越强,优先级就越高(作者这个解释太形象了,小编忍不住要手动点赞!!)。
在原来使用O1调度的Linux上,我们还会把nice值叫做静态优先级,这也基本符合nice值的特点,就是当nice值设定好了之后,除非我们用renice去改它,否则它是不变的。
而priority的值在之前内核的O1调度器上表现是会变化的,所以也叫做动态优先级。
什么是优先级和实时进程?
我们再来看看什么是priority值,就是ps命令中看到的PRI值或者top命令中看到的PR值。
本文为了区分这些概念,以后:
• 统一用nice值表示NI值,或者叫做静态优先级,也就是用nice和renice命令来调整的优先级;
• 而实用priority值表示PRI和PR值,或者叫动态优先级。
• 我们也统一将“优先级”这个词的概念规定为表示priority值的意思。
在内核中,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是MAX_PRIO,它的值为140。
而这个值又是由另外两个值相加组成的,一个是代表nice值取值范围的NICE_WIDTH宏,另一个是代表实时进程(realtime)优先级范围的MAX_RT_PRIO宏。
说白了就是,Linux实际上实现了140个优先级范围,取值范围是从0-139,这个值越小,优先级越高。nice值的-20到19,映射到实际的优先级范围是100-139。
新产生进程的默认优先级被定义为:
1.define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)
实际上对应的就是nice值的0。
正常情况下,任何一个进程的优先级都是这个值,即使我们通过nice和renice命令调整了进程的优先级,它的取值范围也不会超出100-139的范围,除非这个进程是一个实时进程,那么它的优先级取值才会变成0-99这个范围中的一个。
这里隐含了一个信息,就是说当前的Linux是一种已经支持实时进程的操作系统。
什么是实时操作系统?
我们就不再这里详细解释其含义以及在工业领域的应用了,有兴趣的可以参考一下实时操作系统的维基百科。
简单来说,实时操作系统需要保证相关的实时进程在较短的时间内响应,不会有较长的延时,并且要求最小的中断延时和进程切换延时。
对于这样的需求,一般的进程调度算法,无论是O1还是CFS都是无法满足的,所以内核在设计的时候,将实时进程单独映射了100个优先级,这些优先级都要高于正常进程的优先级(nice值),而实时进程的调度算法也不同,它们采用更简单的调度算法来减少调度开销。
总的来说,Linux系统中运行的进程可以分成两类:
• 实时进程
• 非实时进程
它们的主要区别就是通过优先级来区分的。
所有优先级值在0-99范围内的,都是实时进程,所以这个优先级范围也可以叫做实时进程优先级,而100-139范围内的是非实时进程。
在系统中可以使用chrt命令来查看、设置一个进程的实时优先级状态。我们可以先来看一下chrt命令的使用:
我们先来关注显示出的Policy options部分,会发现系统给各种进程提供了5种调度策略。
但是这里并没有说明的是,这五种调度策略是分别给两种进程用的,对于实时进程可以用的调度策略是:SCHED_FIFO、SCHED_RR,而对于非实时进程则是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。
系统的整体优先级策略是:
• 如果系统中存在需要执行的实时进程,则优先执行实时进程。
• 直到实时进程退出或者主动让出CPU时,才会调度执行非实时进程。
实时进程可以指定的优先级范围为1-99,将一个要执行的程序以实时方式执行的方法为:
[root@zorrozou-pc0 zorro]# chrt 10 bash
[root@zorrozou-pc0 zorro]# chrt -p $$
pid 14840’s current scheduling policy: SCHED_RR
pid 14840’s current scheduling priority: 10
可以看到,新打开的bash已经是实时进程,默认调度策略为SCHED_RR,优先级为10。如果想修改调度策略,就加个参数:
[root@zorrozou-pc0 zorro]# chrt -f 10 bash
[root@zorrozou-pc0 zorro]# chrt -p $$
pid 14843’s current scheduling policy: SCHED_FIFO
pid 14843’s current scheduling priority: 10
刚才说过,SCHED_RR和SCHED_FIFO都是实时调度策略,只能给实时进程设置。对于所有实时进程来说,优先级高的(就是priority数字小的)进程一定会保证先于优先级低的进程执行。
SCHED_RR和SCHED_FIFO的调度策略只有当两个实时进程的优先级一样的时候才会发生作用,其区别也是顾名思义:
SCHED_FIFO
以先进先出的队列方式进行调度,在优先级一样的情况下,谁先执行的就先调度谁,除非它退出或者主动释放CPU。
SCHED_RR
以时间片轮转的方式对相同优先级的多个进程进行处理。时间片长度为100ms。
这就是Linux对于实时进程的优先级和相关调度算法的描述。整体很简单,也很实用。
而相对更麻烦的是非实时进程,它们才是Linux上进程的主要分类。对于非实时进程优先级的处理,我们首先还是要来介绍一下它们相关的调度算法:O1和CFS。
什么是O1调度?
O1调度算法是在Linux 2.6开始引入的,到Linux 2.6.23之后内核将调度算法替换成了CFS。
虽然O1算法已经不是当前内核所默认使用的调度算法了,但是由于大量线上的服务器可能使用的Linux版本还是老版本,所以我相信很多服务器还是在使用着O1调度器,那么费一点口舌简单交代一下这个调度器也是有意义的。
这个调度器的名字之所以叫做O1,主要是因为其算法的时间复杂度是O1。
O1调度器仍然是根据经典的时间片分配的思路来进行整体设计的。
简单来说,时间片的思路就是将CPU的执行时间分成一小段一小段的,假如是5ms一段。
于是多个进程如果要“同时”执行,实际上就是每个进程轮流占用5ms的cpu时间,而从1s的时间尺度上看,这些进程就是在“同时”执行的。
当然,对于多核系统来说,就是把每个核心都这样做就行了。而在这种情况下,如何支持优先级呢?
实际上就是将时间片分配成大小不等的若干种,优先级高的进程使用大的时间片,优先级小的进程使用小的时间片。这样在一个周期结速后,优先级大的进程就会占用更多的时间而因此得到特殊待遇。
O1算法还有一个比较特殊的地方是,即使是相同的nice值的进程,也会再根据其CPU的占用情况将其分成两种类型:CPU消耗型和IO消耗性。
典型的CPU消耗型的进程的特点是,它总是要一直占用CPU进行运算,分给它的时间片总是会被耗尽之后,程序才可能发生调度。
比如常见的各种算数运算程序。
而IO消耗型的特点是,它经常时间片没有耗尽就自己主动先释放CPU了。
比如vi,emacs这样的编辑器就是典型的IO消耗型进程。
为什么要这样区分呢?因为IO消耗型的进程经常是跟人交互的进程,比如shell、编辑器等。
当系统中既有这种进程,又有CPU消耗型进程存在,并且其nice值一样时,假设给它们分的时间片长度是一样的,都是500ms,那么人的操作可能会因为CPU消耗型的进程一直占用CPU而变的卡顿。
可以想象,当bash在等待人输入的时候,是不占CPU的,此时CPU消耗的程序会一直运算,假设每次都分到500ms的时间片,此时人在bash上敲入一个字符的时候,那么bash很可能要等个几百ms才能给出响应,因为在人敲入字符的时候,别的进程的时间片很可能并没有耗尽,所以系统不会调度bash程度进行处理。
为了提高IO消耗型进程的响应速度,系统将区分这两类进程,并动态调整CPU消耗的进程将其优先级降低,而IO消耗型的将其优先级变高,以降低CPU消耗进程的时间片的实际长度。
已知nice值的范围是-20-19,其对应priority值的范围是100-139,对于一个默认nice值为0的进程来说,其初始priority值应该是120,随着其不断执行,内核会观察进程的CPU消耗状态,并动态调整priority值,可调整的范围是±5。
就是说,最高优先级可以被自动调整到115,最低到125。这也是为什么nice值叫做静态优先级,而priority值叫做动态优先级的原因。不过这个动态调整的功能在调度器换成CFS之后就不需要了,因为CFS换了另外一种CPU时间分配方式,这个我们后面再说。
什么是CFS完全公平调度?
O1已经是上一代调度器了,由于其对多核、多CPU系统的支持性能并不好,并且内核功能上要加入cgroup等因素,Linux在2.6.23之后开始启用CFS作为对一般优先级(SCHED_OTHER)进程调度方法。
在这个重新设计的调度器中,时间片,动态、静态优先级以及IO消耗,CPU消耗的概念都不再重要。CFS采用了一种全新的方式,对上述功能进行了比较完善的支持。
其设计的基本思路是:我们想要实现一个对所有进程完全公平的调度器。
又是那个老问题:如何做到完全公平?答案跟上一篇IO调度中CFQ的思路类似:
如果当前有n个进程需要调度执行,那么调度器应该在一个比较小的时间范围内,把这n个进程全都调度执行一遍,并且它们平分cpu时间,这样就可以做到所有进程的公平调度。
那么这个比较小的时间就是任意一个R状态进程被调度的最大延时时间,即:任意一个R状态进程,都一定会在这个时间范围内被调度响应。这个时间也可以叫做调度周期,其英文名字叫做:sched_latency_ns。
CFS的优先级
当然,CFS中还需要支持优先级。在新的体系中,优先级是以时间消耗(vruntime增长)的快慢来决定的。
就是说,对于CFS来说,衡量的时间累积的绝对值都是一样纪录在vruntime中的,但是不同优先级的进程时间增长的比率是不同的,高优先级进程时间增长的慢,低优先级时间增长的快。
比如,优先级为19的进程,实际占用cpu为1秒,那么在vruntime中就记录1s。但是如果是-20优先级的进程,那么它很可能实际占CPU用10s,在vruntime中才会纪录1s。
CFS真实实现的不同nice值的cpu消耗时间比例在内核中是按照“每差一级cpu占用时间差10%左右”这个原则来设定的。
这里的大概意思是说,如果有两个nice值为0的进程同时占用cpu,那么它们应该每人占50%的cpu,如果将其中一个进程的nice值调整为1的话,那么此时应保证优先级高的进程比低的多占用10%的cpu,就是nice值为0的占55%,nice值为1的占45%。那么它们占用cpu时间的比例为55:45。
这个值的比例约为1.25。就是说,相邻的两个nice值之间的cpu占用时间比例的差别应该大约为1.25。根据这个原则,内核对40个nice值做了时间计算比例的对应关系,它在内核中以一个数组存在:
多CPU的CFS调度是怎样的?
在上面的叙述中,我们可以认为系统中只有一个CPU,那么相关的调度队列只有一个。
实际情况是系统是有多核甚至多个CPU的,CFS从一开始就考虑了这种情况,它对每个CPU核心都维护一个调度队列,这样每个CPU都对自己的队列进程调度即可。
这也是CFS比O1调度算法更高效的根本原因:每个CPU一个队列,就可以避免对全局队列使用大内核锁,从而提高了并行效率。
当然,这样最直接的影响就是CPU之间的负载可能不均,为了维持CPU之间的负载均衡,CFS要定期对所有CPU进行load balance操作,于是就有可能发生进程在不同CPU的调度队列上切换的行为。
这种操作的过程也需要对相关的CPU队列进行锁操作,从而降低了多个运行队列带来的并行性。
不过总的来说,CFS的并行队列方式还是要比O1的全局队列方式要高效。尤其是在CPU核心越来越多的情况下,全局锁的效率下降显著增加。
最后
本文的目的是从Linux系统进程的优先级为出发点,通过了解相关的知识点,希望大家对系统的进程调度有个整体的了解。
其中,我们也对CFS调度算法进行了比较深入的分析。在我的经验来看,这些知识对我们在观察系统的状态和相关优化的时候都是非常有用的。
比如在使用top命令的时候,NI和PR值到底是什么意思?类似的地方还有ps命令中的NI和PRI值、ulimit命令-e和-r参数的区别等等。当然,希望看完本文后,能让大家对这些命令显示的了解更加深入。
除此之外,我们还会发现,虽然top命令中的PR值和ps -l命令中的PRI值的含义是一样的,但是在优先级相同的情况下,它们显示的值确不一样。
五、进程防护:
如何做进程防护?
1、查看当前有谁在登陆 w
2、查看谁曾经登陆过 last
3、回顾命令历史 histrory
4、检查哪些进程在消耗cpu top
5、检查所有的系统进程 ps aux
6、检查进程的网络使用情况 iftop
7、检查哪些进程在监听网络连接 lsof -i、 netstat -anutp
发现被入侵之后怎么办?
1、技术不太好,可以考虑先关机,然后找到上游防火墙,只允许自己的IP地址SSH,除此之外全部封禁;如果无法访问上游防火墙,则可以使用服务器本身的防火墙策略,当防火墙规则生效之后kill掉对方
2、如果支持诸如串行控制台之类的带外连接登陆服务器,可以将network服务停掉,然后添加防火墙规则
3、修复之后,你永远不知道对方做过什么,最安全的方法是备份所有数据,重装系统。
[root@localhost ~]# w
04:42:24 up 13:22, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 172.16.110.245 04:41 5.00s 0.00s 0.00s sleep 1000
root tty1 :0 Fri08 4days 47.16s 47.16s /usr/bin/Xorg :
root pts/1 :0.0 Mon04 0.00s 0.06s 0.00s w
root pts/2 :0.0 Mon04 24:25m 0.00s 0.00s bash
[root@localhost ~]# pkill -t pts/3 //只是杀掉终端上的进程
[root@localhost ~]# pkill -9 -t pts/3 //连终端都一起杀掉了
六、管道/重定向:
一、文件描述符
文件描述符是一个非负的整数,Linux 中每个运行中的程序(进程),都有一些与之关联的文件描述符,你可以使用文件描述符来访问打开的文件或设备。在标准 I/O 库中,与文件描述符对应的是流。当一个程序开始运行时,它一般会有 3 个已经打开的文件描述符,分别对应三个文件流:
文件描述符 流
0 标准输入流(stdin)
1 标准输出流(stdout)
2 标准错误流(stderr)
显然,还有其他的文件描述符,这里暂时不做讨论。一般情况下,一个程序打开时,会去读取标准输入,将结果写入标准输出,将错误结果写入标准错误输出(默认的标准输入、标准输出和标准错误输出都是终端):
如图上图所示,cat 命令后面没有接参数,则默认读取标准输入,将结果输出到标准输出。很多情况下,我们不希望从标准输入获取程序输入,也不想将程序结果写入标准输出,将错误结果写入到标准错误输出,这时就可以使用重定向来完成相应的需求。
二、输出重定向
输出重定向使用 > 或 >> 操作符。其中 > 操作符表示覆盖输出;>> 操作符表示将输出内容附加到文件尾。
2.1 将标准输出重定向到文件
command > file
command >> file
使用 command > file 命令,可以将 command 的标准输出修改为 file,若当前目录下没有 file 文件,则会创建该文件;若已经存在 file 文件,则会覆盖 file 文件,file 文件原本的数据将会丢失。
使用 command >> file 命令,可以将 command 的标准输出修改为 file,若当目录下没有 file 文件,则创建该文件;若已经存在 file 文件,则将程序结果附加到文件尾。
同样的,以 cat 命令为例:
cat > newfile
My name is tongye
How are you
^D # Ctrl + D,结束输入
cat >> newfile
I am fine
^D
结果如下:
2.2 将标准错误输出重定向到文件
command 2> file
command 2>> file
使用 2> 或 2>> 来对标准错误输出进行重定向。
2.3 将标准输出和标准错误输出重定向到不同文件
command > file1 2> file2
该命令将标准输出和标准错误输出分别重定向到不同文件。
2.4 将标准输出和标准错误输出重定向到同一文件
command > file 2>&1
该命令将标准输出和标准错误输出重定向到同一个文件。
三、输入重定向
使用 < 操作符进行输入重定向:
command < file
该命令可以将 command 的标准输入改为从文件 file 输入。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:https://www.linuxidc.com/Linux/2019-03/157519.htm
1、重定向原理:
I/O管道重定向 I/O Redirection
重定向
改变原有的输出或者输入的方向就是重定向 > >>
FD(文件描述符) 或 Process I/O channels
进程在运行的时候会打开很多的文件,而每打开一个文件就会产生相应的文件描述符,进程使用这些文件描述符来管理或者是访问打开的文件,可能是读入也可能是写入,即进程通过指定的I/O编号去访问文件,每一个编号都会对应一个文件,这个文件可能是字符设备文件,也可能是普通的文本文件
0, 1, and 2, known as standard input, standard output, and standard error
示例1:
[root@xiaochen ~]# ps
PID TTY TIME CMD
4012 pts/0 00:00:00 bash
4114 pts/0 00:00:00 ps
[root@xiaochen ~]# cd /proc/4012/fd
[root@xiaochen fd]# ll
总用量 0
lr-x------ 1 root root 64 2月 14 04:00 0 -> /dev/pts/0 //进程打开的文件
lrwx------ 1 root root 64 2月 14 04:00 1 -> /dev/pts/0
lrwx------ 1 root root 64 2月 14 04:00 2 -> /dev/pts/0
lrwx------ 1 root root 64 2月 14 04:03 255 -> /dev/pts/0
[root@xiaochen fd]# tty
/dev/pts/0
示例2:
[root@www ~]# vim a.txt
[root@www ~]# ps aux |grep vim
[root@www ~]# ll /proc/30761/fd
2、输出重定向:
一、输出重定向 (覆盖,追加)
进程的正确和错误的输出在文件描述符1和2中,这两个文件描述符对应的文件默认都是终端这个字符设备文件,如果我们将这个字符设备文件换成另外的一个文件,那文件描述符对应的文件就会发生变化,从而导致最终的输出方向发生变化,这种行为就是输出重定向。
正确输出: 1> 1>> 等价于 > >>
错误输出: 2> 2>>
[root@xiaochen ~]# date 1> /dev/pts/2
[root@xiaochen ~]# date 1> date.txt
[root@xiaochen ~]# date >> date.txt
[root@xiaochen ~]# date 2> date.txt
正确和错误都输入到相同位置:
[root@xiaochen ~]# ls /home/ /ahfiuds >list.txt 2>&1 //重定向到相同的位置
[root@xiaochen ~]# ls /home/ /adjfoiaf &>list.txt
[root@xiaochen ~]# ls /home/ /adjfaosdkf &>/dev/null //空设备,即将产生的输出丢掉
3、输入重定向:
二、输入重定向
进程的输入来自于文件描述符0,这个文件描述符默认对应的文件是终端设备文件,也就是来自于键盘,我们改变它的输入方向,让他不来自于键盘,这种行为就是输入重定向。
标准输入: < 等价 0
1、mysql课程中用到
[root@xiaochen ~]# mysql -uroot -p123 < bbs.sql
2、制作自定义大小的文件
[root@xiaochen ~]# dd /file2.txt bs=1M count=20
4、管道:
管道
作用:实现进程间通信的手段之一
好处:Linux的程序小,功能单一,效率高,但是无法完成很复杂的任务,就需要借助于管道将多个进程组合起来
用法:command1 | command2 |command3 |…
[root@xiaochen ~]# ps aux |grep 'sshd'
[root@xiaochen ~]# rpm -qa |grep bash
sort对字段排序
[root@xiaochen ~]# sort -rn /tmp/a.txt
-n 按数值,默认按字符排序
-r 逆序
uniq去重
[root@xiaochen ~]# uniq -c a.txt //统计重复几次
awk打印指定的字段
例2:统计当前/etc/passwd中用户使用的shell类型
思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@xiaochen ~]# awk -F: '{print $7}' /etc/passwd
[root@xiaochen ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@xiaochen ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@xiaochen ~]# awk -F: '{print $NF}' /etc/passwd |sort |uniq -c
-F: 指定字段分隔符,默认以空格或者是tab分隔
$7 第七个字段
$NF表示最后一个字段
$(NF-1)表示倒数第二个字段
head取头10个
#head -1 /etc/passwd //取文件的第一行
tail取尾10个
#tail -2 /etc/passwd //取文件的最后一行
less上翻下翻查看
#ll /dev/ |less //查看/dev下的文件,支持上翻,下翻
|tee管道(三通管道)
借助于三通管道可以实现将前一个进程的输出作为后一个进程的输入,也可以将前一个进程的输出结果重定向到一个文件中。
|tee file 覆盖
|tee -a file 追加
[root@xiaochen ~]# ip a show eth0 |tee file1 |grep 'inet ' |tee file2 |awk -F"/" '{print $1}' |tee file3 |awk '{print $2}' |tee file4
172.16.140.1
[root@xiaochen ~]# cat file1
13: br0: mtu 1500 qdisc noqueue state UNKNOWN
link/ether 3c:97:0e:54:c3:57 brd ff:ff:ff:ff:ff:ff
inet 172.16.140.1/24 brd 172.16.140.255 scope global br0
inet6 fe80::3e97:eff:fe54:c357/64 scope link
valid_lft forever preferred_lft forever
[root@xiaochen ~]# cat file2
inet 172.16.140.1/24 brd 172.16.140.255 scope global br0
[root@xiaochen ~]# cat file3
inet 172.16.140.1
[root@xiaochen ~]# cat file4
172.16.140.1
存储:
存储的介绍:
光盘、硬盘(U盘、磁盘、固态)
1.从工作原理上对于硬盘的分类:
机械硬盘HDD:又称之为磁盘
盘片:磁盘上面有一摞盘片
磁道:盘片上一圈一圈的是磁道
扇区:磁道被划分之后是扇区,以前默认是512B(字节),现在基本上是4k
柱面:半径相同的盘片组成一个柱子一样的体,叫做柱面。
硬盘的转速:1400r/min 7200r/min 10000r/min 15000r/min
固态硬盘SSD:没有盘片,里面都是芯片和电子,目前的在dell r730的服务器上有应用。
SSD的优势
SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械硬盘的性能瓶颈,
拥有极高的存储性能,被认为是存储技术发展的未来新星。
固态硬盘的全集成电路化、无任何机械运动部件的革命性设计,从根本上解决了在移动办公环境下,对于数据读
写稳定性的需求。全集成电路化设计可以让固态硬盘
做成任何形状。与传统硬盘相比,SSD固态电子盘具有以下优点:
第一,SSD不需要机械结构,完全的半导体化,不存在数据查找时间、延迟时间和磁盘寻道时间,数据存取速度快。
第二,SSD全部采用闪存芯片,经久耐用,防震抗摔,即使发生与硬物碰撞,数据丢失的可能性也能够降到最小。
第三,得益于无机械部件及FLASH闪存芯片,SSD没有任何噪音,功耗低。
第四,质量轻,比常规1.8英寸硬盘重量轻20-30克,使得便携设备搭载多块SSD成为可能。同时因其完全半导体化,
无结构限制,可根据实际情况设计成各种不同接口、形状的特殊电子硬盘。
2.磁盘的尺寸(英寸)
3.5 2.5 1.8
3.从热插拔方式
热插拔
非热插拔
UPS电源
4.从硬盘接口
IDE ——> SATA 1代/2代/3代
SCSI ——> SAS
PCIE ssd固态硬盘,直接接在pci总线上,速度非常的块,但是不适合热插拔,服务器中不常见
FC 光纤接口的硬盘
两边的接口:一个是连数据的,一个是连电源的。SAS(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术,和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。
5.kernel对不同接口硬盘的命名
硬盘设备命名
物理硬盘: /dev/sd[a-z]
KVM虚拟化: /dev/vd[a-z](半虚拟化驱动)
/dev/sd[a-z](全虚拟化驱动)
KVM增加硬盘
半虚拟化驱动磁盘: online
全虚拟化驱动磁盘: offline
vmware添加硬盘
HP服务器硬盘
/dev/cciss/c0d0
/dev/cciss/c0d0p1 //c0第一个控制器, d0第一块磁盘, p1分区1
/dev/cciss/c0d0p2 //c0第一个控制器, d0第一块磁盘, p2分区2
两种分区方式(针对分区表)
2TB以下的硬盘
分区软件 分区表
fdisk MSDOS(MBR)
gdisk(parted) GPT
2TB以上的硬盘
gdisk GPT
MSDOS(MBR)分区的限制:
主分区<=3,扩展分区 1,逻辑分区
只支持4个主分区,总分区数不能超过15个
只支持2TB以下的硬盘
GPT的限制:
128个分区
注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失!
单位转换:
bits 1byte=8bits
B
KB 1024
MB
GB
TB------------ GPT
PB
EB
ZB
Y
KVM增加硬盘
[root@www ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 40G 0 disk
└─vda1 253:1 0 40G 0 part /
kvm虚拟机中半虚拟化驱动的磁盘支持在线添加,其他的是离线添加
vmware虚拟机中SATA的磁盘支持在线添加,其他的是离线添加
注意:离线就是要有关机的状态,重启不行
分区(基本分区)---------->格式化------------>挂载
查看新设备是否发现
[root@localhost ~]# ll /dev/sd* //查看Kernel识别到的设备
brw-rw----. 1 root disk 8, 0 7月 7 16:34 /dev/sda
brw-rw----. 1 root disk 8, 1 7月 7 16:34 /dev/sda1
brw-rw----. 1 root disk 8, 2 7月 7 16:34 /dev/sda2
brw-rw----. 1 root disk 8, 3 7月 7 16:34 /dev/sda3
主设备号:表示为同一种设备类型,或者是说kernel使用的是相同的驱动
从设备号:在同一类型设备中内核找到他们的一个顺序的编号
[root@server0 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 10G 0 disk
└─vda1 253:1 0 10G 0 part /
vdb 253:16 0 10G 0 disk
vdc 252:32 0 8G 0 disk
使用工具分区
fdisk
MBR 14个分区(4个主分区,扩展分区,逻辑分区)
1.创建分区
#fdisk /dev/vdb
Command (m for help): m---------------------------------获得帮助
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): n---------------------------------添加分区
Command action
p primary partition (1-4) ------------------------------添加主分区
e extended ------------------------------------------------添加扩展分区
#fdisk -l /dev/vdb
#partprobe /dev/vdb //刷新内核分区列表
#ll /dev/vdb*
brw-rw----. 1 root disk 253, 16 11月 30 15:13 /dev/vdb
brw-rw----. 1 root disk 253, 17 11月 30 15:13 /dev/vdb1
brw-rw----. 1 root disk 253, 18 11月 30 15:13 /dev/vdb2
gdisk
GPT 128个主分区
1.创建分区
#gdisk -l /dev/vdc
#gdisk /dev/vdc
#partprobe /dev/vdc
#ll /dev/vdc*
brw-rw----. 1 root disk 253, 32 Jun 6 17:38 /dev/vdc
brw-rw----. 1 root disk 253, 33 Jun 6 17:38 /dev/vdc1
brw-rw----. 1 root disk 253, 34 Jun 6 17:38 /dev/vdc2
格式化(创建文件系统)
indwos: FAT,FAT32,NTFS
inux: VFAT,Ext2,Ext3,Ext4,GFS,GFS2
root@xiaochen ~]# mkfs.ext4 /dev/sdb1 //100M的分区
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
lock size=1024 (log=0) //文件系统分配最小单元,单位是B
Fragment size=1024 (log=0)
25688 inodes, 102400 blocks
9765 blocks (5.00%) reserved for the super user
[root@xiaochen ~]# mkfs.xfs /dev/sdb1
block size: 文件存储的最小单元
挂载
建立挂载
#mkdir /mnt/disk1 //建立挂载点,建议空目录
#mkdir /mnt/disk2
==手动: 临时
[root@xiaochen ~]# mount -o ro -t ext4 /dev/sdb1 /mnt/disk1
[root@xiaochen ~]# mount /dev/sdb2 /mnt/disk2
[root@xiaochen ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 97M 5.6M 87M 7% /mnt/disk1
/dev/sdb2 1008M 34M 924M 4% /mnt/disk2
[root@xiaochen ~]# mount
/dev/sdb1 on /mnt/disk1 type ext4 (ro)
/dev/sdb2 on /mnt/disk2 type ext4 (rw)
==开机自动挂载 /etc/fstab
[root@xiaochen ~]# umount /dev/sdb1
注意:因为设备名会变,导致我们重启起不来,故我们要用uuid进行挂载
[root@xiaochen ~]# blkid /dev/sdb1
/dev/sdb1: UUID=“653a949d-ebf5-4543-9f67-4b71cbe5cf2b” TYPE=“ext4”
[root@xiaochen ~]# vim /etc/fstab
UUID=“653a949d-ebf5-4543-9f67-4b71cbe5cf2b” /mnt/disk1 ext4 ro 0 0
[root@xiaochen ~]# mount -a //读取/etc/fstab并挂载
总结:
1、分区
2、partprobe 硬盘 //刷新
3、格式化/创建文件系统 mkfs.xfs mkfs.ext4
4、准备文件夹(挂载点)
5、挂载
1)临时 mount 文件系统 挂载点
2)永久 vim /etc/fstab
uuid 挂载点 文件系统(xfs ext4) defaults 0 0
逻辑卷LVM:
逻辑卷LVM
本节内容:
掌握:逻辑卷的创建及扩容
了解内容:逻辑卷缩容、删除lv
逻辑卷的扩大功能是支持在线的
逻辑卷的缩小功能必须是离线的
逻辑卷-------->文件系统--------->mount>
参考命令:
创建 显示详细 显示 扩展 缩小 删除
pvcreate pvdisplay pvs pvremove
vgcreate vgdisplay vgs vgextend vgreduce vgremove
lvcreate lvdisplay lvs lvextend lvreduce lvremove
#[root@localhost ~]# yum -y install lvm2
一、创建逻辑卷
创建物理卷PV(整个硬盘或者是分区[建立在raid之上])
[root@xiaochen ~]# pvcreate /dev/sdc
创建卷组VG
[root@xiaochen ~]# vgcreate vg01 /dev/sdc
创建逻辑卷LV
[root@xiaochen ~]# lvcreate -L 400M -n lv02 vg01
[root@xiaochen ~]# lvcreate -l 200 -n lv03 vg01
[root@xiaochen ~]# lvscan
ACTIVE '/dev/vg02/lv02' [400.00 MB] inherit
-L : 指定尺寸
-l : 指定PE(physical extend)个数
===================================================================================
企业案例:
[root@xiaochen ~]# lvcreate -l 50%VG -n lv02 vg01 //总空间的50%
[root@xiaochen ~]# lvcreate -l 100%FREE -n lv03 vg01 //剩余空间的100%
二、在线扩展逻辑卷
第一种情况:lv所在的卷组还有足够用于扩展的空间
[root@xiaochen ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv02 vg02 -wi-ao 400.00M
lv03 vg02 -wi-ao 800.00M
[root@xiaochen ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg02 1 2 0 wz--n- 100.00G 98.82G
[root@xiaochen ~]# lvextend -L 1G /dev/vg02/lv02
[root@xiaochen ~]# lvextend -L +1G /dev/vg02/lv03
[root@xiaochen ~]# lvscan
ACTIVE '/dev/vg02/lv02' [1.00 GB] inherit
ACTIVE '/dev/vg02/lv03' [800.00 MB] inherit
[root@xiaochen ~]# df -Th
EXT2/3/4文件系统扩展:
[root@xiaochen ~]# resize2fs /dev/vg02/lv02
[root@xiaochen ~]# df -Th
XFS文件系统扩展:
[root@xiaochen ~]# xfs_growfs /dev/vg1/lv2
[root@xiaochen ~]# df -Th
第二种情况:lv所在的卷组没有足够的空间
[root@xiaochen ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 1 4 0 wz--n- 9.97G 0
vg02 1 2 0 wz--n- 100.00G 98.21G
[root@xiaochen ~]# pvcreate /dev/sdd //建立PV
[root@xiaochen ~]# vgextend vg02 /dev/sdd //扩展卷组
[root@xiaochen ~]# lvextend -L 100T /dev/vg02/lv02 //扩展逻辑卷
[root@xiaochen ~]# resize2fs /dev/vg02/lv02 //扩文件系统
========================================
课后作业:了解的内容
缩小逻辑卷: off-line
企业案例:
如果磁盘无法正常使用,请使用如下命令查看具体错误:
#Dmesg -T | grep -i io
交换分区:
增加交换分区
作用: ‘提升‘ 内存的容量,防止OOM(Out Of memory),但是毕竟是用硬盘做的,永远不能替换内存
一、查看现有的交换分区
[root@xiaochen ~]# free -m
total used free shared buffers cached
Mem: 1010 874 135 0 51 560 //物理内存
-/+ buffers/cache: 262 747
Swap: 1023 0 1023 //交换分区的内存
[root@xiaochen ~]# swapon -s //查看交换分区
Filename Type Size Used Priority
/dev/mapper/vg01-lv_swap partition 1048568 0 -1
[root@xiaochen ~]# cat /proc/swaps
二、增加交换分区
方法一: 使用分区或逻辑卷创建
Command (m for help): p
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x948febe7
Device Boot Start End Blocks Id System
/dev/sda1 2048 2448 200+ 83 Linux
/dev/sda2 2449 821648 409600 83 Linux
/dev/sda3 821649 2460048 819200 82 Linux swap / Solaris
[root@xiaochen ~]# partprobe /dev/sda
初始化交换分区
[root@xiaochen ~]# mkswap /dev/sda7
激活交换分区
[root@xiaochen ~]# vim /etc/fstab
/dev/sda7 swap swap defaults 0 0
root@xiaochen ~]# swapon -a
[root@xiaochen ~]# swapon -s
Filename Type Size Used Priority
/dev/mapper/vg01-lv_swap partition 1048568 0 -1
/dev/sda7 partition 499992 0 -2
[root@xiaochen ~]# free -m
total used free shared buffers cached
Mem: 482 369 112 0 15 82
-/+ buffers/cache: 272 210
Swap: 1391 4 1387
方法二:使用文件创建
[root@xiaochen ~]# dd /swap1.img bs=1M count=512 //单位1M,一共512块
[root@xiaochen ~]# mkswap /swap1.img -f //-f强制
Setting up swapspace version 1, size = 536866 kB
[root@xiaochen ~]# vim /etc/fstab
/swap1.img swap swap defaults 0 0
[root@xiaochen ~]# swapon -a
[root@xiaochen ~]# swapon -s
Filename Type Size Used Priority
/dev/mapper/vg01-lv_swap partition 1048568 0 -1
/dev/sda7 partition 499992 0 -2
/swap1.img file 524280 0 -3
[root@xiaochen ~]# free -m
total used free shared buffers cached
Mem: 482 370 111 0 15 82
-/+ buffers/cache: 272 209
Swap: 1891 4 1887
三、测试交换分区
[root@xiaochen ~]# dd /aaa.txt bs=1G count=2
[root@xiaochen ~]# swapon -s
四、对交换分区调优
多个交换分区分布在不同的磁盘,挂载时,使用相同的优先级
[root@xiaochen ~]# vim /etc/fstab
/dev/sda3 swap swap defaults,pri=1 0 0
/file1 swap swap defaults,pri=1 0 0
[root@xiaochen ~]# swapoff -a
[root@xiaochen ~]# swapon -a
[root@xiaochen ~]# dd /aaa.txt bs=1G count=2
[root@xiaochen ~]# swapon -s
认识EXT4文件系统
红帽的官方文档:docs.redhat.com
Ext3/Ext4磁盘布局(一共分成n个组): 文件系统高达数百GB时,将所有的inode和block放置到一起是很不理智的决定,因为inode和block的数量庞大,不容易管理,因此Ext系列的文件系统在格式化的时候会被区分为多个区块群组 (block group) ,每个区块群组的布局都如下所示:
Superblock:整个文件的核心,记录整个文件系统的整体信息,沒有Superblock ,就沒有filesystem
• block 与 inode 的总量;
• 文件系统的格式
• 未使用与已使用的 inode / block 数量;
• block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 或 256bytes);
• filesystem 的挂载时间、最近一次写入数据的时间、最近一次检查 (fsck) 的时间等文件系统相关信息;
• 每个block group 都可能含有 superblock,这样可以进行用于 superblock 的修复;
group descriptor table:描述block group 的开始与结束的block的号码以及说明每个区段(super block、bitmap、data block)分别介于哪个block号码之间
bitmap:位图,由数字0和1组成,0表示没有用,1表示已经占用了
inode table: 存储文件的元数据
• 文件的权限(read/write/excute);
• 文件的属主/属组(owner/group);
• 文件的大小;
• 文件的(ctime);
• 文件的(atime);
• 文件的(mtime);
• 记录文件内容所在的block number (pointer);
data block: 存储文件的实际数据
EXT2/EXT3/EXT4 日志式文件系統
新建文件
先确定使用者对于想新创建文件目录是否具有 w 与 x 的权限;
查询superblock,看是否有可用的inode和block分配给新文件,有则继续去查询inode bitmap;
根据 inode bitmap 找到沒有使用的 inode 号码,并将文件的权限和属性写入;
根据 block bitmap 找到沒有使用的 block号码,将文件的实际数据写入 block 中,且更新 inode 的 block 指向信息;
将刚刚写入的 inode 与 block 信息同步更新 inode bitmap 与 block bitmap,并更新 superblock 的內容。
删除文件
删除文件时,block bitmap中就会将原本占用的block号码释放出来,就是将标记修改成未使用.
读取文件:
inode本身并不记录文件的名字,文件名是记录在文件的上一级目录中的,所以在读取文件时要先经过目录的inode与block,然后找到待读取文件的inode号码,最终读取到正确的文件。
创建文件系统
[root@xiaochen ~]# mkfs.ext4 /dev/sda7
[root@xiaochen ~]# mkfs.ext4 -N 13000 /dev/sda7 修改inode总数
[root@xiaochen ~]# mkfs.ext4 -b 4096 /dev/sda7 指定块的大小
1K
mkfs.ext4 -N 50000 -b 1024 /dev/sdb9
查看superblock(文件系统的信息)
/dev/sda7,没有创建文件系统的设备或者是分区我们称之为裸设备
dumpe2fs
[root@xiaochen ~]# dumpe2fs /dev/sda2 |less
tune2fs
[root@xiaochen ~]# tune2fs -l /dev/sda3 //查看文件系统上一次挂载的信息
tune2fs 1.39 (29-May-2006)
Filesystem volume name: xiao //使用卷标挂载的
Last mounted on:
Filesystem UUID: 28459f88-87dc-4624-94a7-07b0f3eb2420
Filesystem magic number: 0xEF53 //用来代表文件系统的格式的,底层的自己的编号
Filesystem revision #: 1 (dynamic) //ext系统的几,一个内部编号而已
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options: (none) //根分区支持acl
Filesystem state: clean //状态为clean,否则开机进行磁盘检测的时候回停着不动
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 48960 //分区被格式化之后的inode总数
Block count: 195312 //一共多大的空间,默认单位是k
Reserved block count: 9765 //为了方便管理,预留给超级用户的空间
Free blocks: 183410
Free inodes: 48946
First block: 1 //第一个块从哪里开始
Block size: 1024
First inode: 11
Inode size: 128
Journal inode: 8 //日志
Mount count: 33 //达到挂载次数进行磁盘检测,然后重新归0
Maximum mount count: -1
EXT4修复文件系统:
修复文件系统 fsck -y,e2fsck -fy
案例1: 系统无法启动
案例二:Read-only file system
如果运行中的服务器的某一个分区出现readonly,导致进程无法写这个分区(比如nginx进程无法写日志文件到此分区,手动测试touch文件到此分区也显示:cannot touch ‘xxxxx’:Read-only file system),该怎么办?
解决:磁盘read-only的原因一般有2种,一种是没有正常关机导致,还有一种是硬盘故障导致。
如果是/分区,这种情况只能下线报修磁盘了;如果是其它分区,则可以尝试三步解决此问题:
1. 先卸载此分区(修复必须是非挂载的)
2. 再fsck.ext4 -fy /dev/sdb1
3. 最后挂载此分区,检查是否可以正常读写。
如果仍旧不可以正常读写,请报修磁盘。
注:以上操作过程,请保证服务器不在线上提供服务,生产中很少有单点问题,所以无需担心影响业务。
案例三:修复superblock
挂载的时候报错超级快损坏的解决办法
找到备份的superblock
[root@tianyun ~]# dumpe2fs -h /dev/datavg/lv1 |grep 'Blocks per group'
dumpe2fs 1.42.9 (28-Dec-2013)
Blocks per group: 8192
利用备份的 superblock恢复superblock
[root@tianyun ~]# fsck.ext4 -b 8192 /dev/datavg/lv1
xfs文件系统的管理:
XFS文件系统
Centos7 默认的文件系统,为什么要放弃EXT家族?
EXT 家族支持度最广:
但创建文件系统(格式化)慢!
但修复慢!
但文件系统存储容量有限!
xfs 同样是一种日志式文件系統:
高容量,支持大存储
高性能,创建/修复文件系统快
inode 与 block 都是系統需要用到時,才动态配置产生
XFS文件系统的三个区
• 数据区 (data section)
数据区就跟之前了解到的 ext 家族一样,包括 inode/data block/superblock 等信息,都放在该区块。
• 文件系统日志区 (log section)
• 实时运行区 (realtime section)
#xfs_info /dev/sda1
xfs修复文件系统:
修复 XFS 文件系统 xfs_repair
[root@xiaochen ~]# xfs_repair /dev/vda1
xfs_repair: /dev/vda1 contains a mounted filesystem
xfs_repair: /dev/vda1 contains a mounted and writable filesystem
fatal error -- couldn't initialize XFS library
[root@xiaochen ~]# umount /dev/vda1
[root@xiaochen ~]# xfs_repair /dev/vda1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
- found root inode chunk
LiveCD
文件链接
一、符号链接 symbolic link
软链接只是用链接后的文件作为一个指向源文件的路径,链接后的文件是一个新文件,每个文件之间的inode不相同,软连接后的文件的权限都是777,大小是源文件的路径的字符个数。软连接的源文件不可以剪切删除和重命名
对文件做符号链接
[root@xiaochen ~]# echo 222 > /file222.txt
[root@xiaochen boot]# cd /
[root@xiaochen /]# ln -s file222.txt /boot/ruan.txt
[root@xiaochen /]# ll /boot/ruan.txt
lrwxrwxrwx 1 root root 11 2月 14 04:49 /boot/ruan.txt -> file222.txt
[root@xiaochen /]# cat /boot/ruan.txt
cat: /boot/ruan.txt: 没有那个文件或目录
[root@xiaochen ~]# ln -s /file222.txt /boot/s-file222.txt
[root@xiaochen ~]# ll -i /file222.txt /boot/s-file222.txt
41 lrwxrwxrwx 1 root root 12 Jan 10 16:19 /boot/s-file222.txt -> /file222.txt
18 -rw-r--r-- 1 root root 4 Jan 10 16:18 /file222.txt
[root@xiaochen ~]# chmod 666 /boot/s-file222.txt
[root@xiaochen ~]# ll -i /file222.txt /boot/s-file222.txt
24 lrwxrwxrwx 1 root root 12 2月 14 04:47 /boot/s-file222.txt -> /file222.txt
14 -rw-rw-rw- 1 root root 4 2月 14 04:47 /file222.txt
对目录做符号链接
[root@xiaochen ~]# mkdir /dir1
[root@xiaochen ~]# touch /dir1/file1
[root@xiaochen ~]# ln -s /dir1/ /dir2
[root@xiaochen ~]# ll -di /dir1 /dir2 -d
916085 drwxr-xr-x 2 root root 4096 Jul 29 22:43 /dir1/
16 lrwxrwxrwx 1 root root 6 Jul 29 22:44 /dir2 -> /dir1/
删除目录软链接
[root@xiaochen ~]# rm -rf /dir2/ 删除目录下的文件
[root@xiaochen ~]# ll -di /dir1 /dir2
916085 drwxr-xr-x 2 root root 4096 Jul 30 06:48 /dir1
16 lrwxrwxrwx 1 root root 6 Jul 29 22:44 /dir2 -> /dir1/
[root@xiaochen ~]# unlink /dir2 删除链接文件
二、硬链接
硬链接是多个文件名对应到同一个inode;故硬链接的文件和源文件的inode,权限,属主,属组,时间,类型…都一样
硬链接的源文件可以剪切删除重命名
对文件做硬链接
[root@xiaochen ~]# echo 111 > /file111.txt
[root@xiaochen ~]# ln /file111.txt /etc
[root@xiaochen ~]# ln file111.txt /etc/h-111.txt
[root@xiaochen ~]# ln /file111.txt /boot/
ln: 创建硬链接"/boot/file222.txt" => "/file222.txt": 无效的跨设备连接
[root@xiaochen ~]# ll -i /file111.txt /etc/file111.txt /etc/h-111.txt
17 -rw-r--r-- 3 root root 4 Jan 10 16:16 /etc/file111.txt
17 -rw-r--r-- 3 root root 4 Jan 10 16:16 /etc/h-111.txt
17 -rw-r--r-- 3 root root 4 Jan 10 16:16 /file111.txt
对目录做硬链接
[root@xiaochen ~]# ln dir111/ /boot/
ln: "dir111/": 不允许将硬链接指向目录
软硬链接的区别
1.创建命令不同
ln -s /root/ruan.txt /root/桌面/ ln /root/ying.txt /root/桌面/
2.软链接创建时必须使用绝对路径(链接和源文件在同一目录下,可以相对路径)
硬链接创建时可以绝对路径也可相对路径
3.软链接的源文件不可以剪切,重命名,删除
硬链接的源文件可以剪切,重命名,删除
4.软链接的链接文件权限永远是777,即使将链接文件的权限进行了修改,也不会发生变化,变得是源文件的权限
硬链接的链接文件权限永远和源文件相同
5.软链接的链接文件的inode号和源文件不同
硬链接的链接文件的inode号和源文件相同
6.软连接可以对目录操作
硬链接不支持对目录操作,是针对于上层来说,底层是可以针对于目录做硬链接的,通过代码就可以实现
7.软连接可以跨文件系统
硬链接不可以跨文件系统,因为硬链接是存放在源文件的同一个block上面的
8.软链接可以跨越文件系统,且可以针对于目录做软链接
硬链接可以缩短文件路径;且可以防止重要的文件误删除
文件查找:
RAID(Redundant Arrays of Inexpensive Disks)
RAID:廉价磁盘冗余阵列
作 用:容错、提升读写速率
RAID类型 个数 利用率 优缺点
-------------------------------------
RAID0 条带集 2+ 100% 读写速率快,不容错
RAID1 镜像集 2+ 50% 读写速率一般,容错
RAID5 带奇偶校验条带集 3+ (n-1)/n 读写速率快,容错,允许坏一块
RAID6 带奇偶双校验条带集 4+ (n-2)/n 读写快,容错,允许坏两块
RAID01
RAID10 RAID1的安全+RAID0的高速 4 50% 读写速率快,容错
RAID50 RAID5的安全+RAID0的高速 6 (n-2)/n 读写速率快,容错
RAID60 RAID6的安全+RAID0的高速 8 (n-4)/n 读写速率快,容错
-----------------------------------
请欣赏raid动态图
http://stor.51cto.com/art/201712/560803.htm
一、不同场景RAID的使用
RAID 实现方式
硬RAID: 需要RAID卡,有自己的CPU,处理速度快,分为有电池和无电池的
软RAID: 通过操作系统实现,比如Windows、Linux
一、命令文件
#which ls //PATH环境变量 (echo $PATH)
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/htop/bin/:/root/bin
跳过别名
命令之前加\,用于跳过别名
#\ls
#\cp file.txt /tmp/
二、任意文件
[root@centos-9 ~]# yum -y install mlocate
A. locate (查询数据库,查找速度比较快: /var/lib/mlocate/mlocate.db)
计划任务:每天自动更新数据库 /etc/cron.daily/mlocate.cron
手动更新数据库会大量消耗IO:updatedb
locate ifcfg-eth0
文件查找:
文件的查找find
find options expression
[root@xiaochen ~]# find /home/
=expression=
按文件名:
[root@xiaochen ~]# find /etc /tmp -name "ifcfg-eth0"
[root@xiaochen ~]# find /etc -iname "ifcfg-eth0" //-i忽略大小写
[root@xiaochen ~]# find /etc -iname "ifcfg-eth*"
按文件大小:
[root@xiaochen ~]# find /etc -size +5M //大于5M
[root@xiaochen ~]# find /etc -size 5M
[root@xiaochen ~]# find /etc -size -5M -print
[root@xiaochen ~]# find /etc -size +5M -ls
按时间找(atime,mtime,ctime):
[root@xiaochen ~]# find /etc -mtime +5 //修改时间超过5天
[root@xiaochen ~]# find /etc -mtime 5 //修改时间等于5天
[root@xiaochen ~]# find /etc -mtime -5 //修改时间5天以内
注:修改时间5天是按照小时算的,即从此刻往前120h
按属主和属组找
[root@xiaochen ~]# find /home -user alice -a -group alice //属主和属组都是alice的
[root@xiaochen ~]# find /home -user alice -o -group alice //属主或者是属组和alice
查找系统中没有属主或者是没有属组的文件,然后将他们删除
[root@server tmp]# find /home/ /tmp/ /var/spool/mail/ \( -nogroup -o -nouser \)
[root@server tmp]# find /home/ /tmp/ /var/spool/mail/ \( -nogroup -o -nouser \) -delete
[root@server tmp]# find /home/ /tmp/ /var/spool/mail/ -nogroup -o -nouser
按文件类型找
[root@xiaochen ~]# find /etc -type f //查找文件类型是普通文件的
[root@xiaochen ~]# find /etc -type d //查找文件类型是目录的
find找到之后的处理动作(默认是-print)
[root@localhost ftp]# find /etc/ -name ifcfg-lo -ls;
67408134 4 -rw-r--r-- 1 root root 254 Jan 3 2018 /etc/sysconfig/network-scripts/ifcfg-l
[root@localhost ftp]# find /etc/ -name ifcfg-lo -exec cp {} /tmp \;
[root@localhost ftp]# ls /tmp/ifcfg-lo
ifcfg-lo
find结合xargs
[root@xiaochen ~]# find /etc -name "ifcfg*" |xargs -I {} ls -lh {}
[root@xiaochen ~]# find . -name "*.txt" |xargs -I {} rm -rf {}
[root@xiaochen ~]# find /etc -name "ifcfg-eth0" |xargs -I {} cp -rf {} /var/tmp //I表示替换
find作业:
[root@server ~]# find /var/tmp/etc/ -type d |xargs -I {} chmod 777 {}
[root@server ~]# find /var/tmp/etc/ -type f |xargs -I {} chmod 666 {}
3.以下命令的区别是什么?
[root@xiaochen ~]# find /etc -name “ifcfg*” -exec rm -rf {} ;
[root@xiaochen ~]# find /etc -name “ifcfg*” -exec rm -rf {} +
4.find /home/ -nouser -o -nogroup
将找到的系统中的没有属主或者是没有属组的文件删掉,一条命令完成
[root@server ~]# find /home/ ( -nouser -o -nogroup ) |xargs -I {} rm -rf {}
5.在/tmp目录下创建一个目录dir1,在dir1目录中创建file1-file20二十个文件,要求将除了file5之外的其他文件删掉
[root@server dir1]# cd /tmp/dir
[root@server dir1]# find . ! -name file5 |xargs -I {} rm -rf {}
rm: refusing to remove ‘.’ or ‘…’ directory: skipping ‘.’
[root@server dir1]# ll
total 0
-rw-r–r-- 1 root root 0 Mar 5 12:15 file5
文件打包及压缩
[root@server ~]# yum -y install bzip2
=打包(归档),压缩=
c即create创建,f打包后的文件名
[root@xiaochen ~]# tar -czf etc1.tar.gz /etc //-z 调用gzip工具进行压缩
[root@xiaochen ~]# tar -cjf etc2.tar.bz2 /etc //-j 调用bzip2工具进行压缩
[root@xiaochen ~]# tar -cJf etc3.tar.xz /etc //-J 调用xz工具进行压缩
[root@xiaochen ~]# ll -h etc*
-rw-r--r--. 1 root root 8.7M 3月 12 00:08 etc1.tar.gz
-rw-r--r--. 1 root root 7.5M 3月 12 00:08 etc2.tar.bz2
-rw-r--r--. 1 root root 4.8M 3月 12 00:09 etc3.tar.xz
=查询=
[root@xiaochen ~]# file a.txt.gz
a.txt.gz: gzip compressed data, was "a.txt", from Unix, last modified: Wed Nov 8 15:23:10 2017
[root@xiaochen ~]# tar -ztvf etc1.tar.gz //查询gzip压缩的文件
[root@xiaochen ~]# tar -jtvf etc2.tar.bz2 //查询bzip2压缩的文件
[root@xiaochen ~]# tar -Jtvf etc3.tar.xz //查询xz压缩的文件
=解压,解包=
[root@xiaochen ~]# tar -xzvf etc1.tar.gz //x解包
[root@xiaochen ~]# tar -xvf etc1.tar.gz //无需指定解压工具,tar会自动判断
[root@xiaochen ~]# tar -xvf etc2.tar.bz2 -C /tmp //-C重定向到//tmp目录
[root@xiaochen ~]# tar xf etc3.tar.xz
==解压zip
[root@server ~]# yum -y install unzip
[root@xiaochen ~]# unzip xxx.zip
file 查看文件类型
-普通文件(文本文件,二进制文件,压缩文件。。。)
d目录文件(蓝色)
b设备文件(块设备)存储设备硬盘,U盘 /dev/sda, /dev/sda1
c设备文件(字符设备)打印机,终端 /dev/tty1
s套接字文件
p管道文件
l链接文件(淡蓝色)lrwxrwxrwx
[root@xiaochen ~]# file /etc/hostname
/etc/hostname: ASCII text
[root@xiaochen ~]# file /dev/sda
/dev/sda: block special
[root@xiaochen ~]# file /dev/zero
/dev/zero: character special
[root@xiaochen ~]# file -b /dev/zero
character special
查看文件的详细属性
[root@server ~]# stat /etc/passwd
File: ‘/etc/passwd’
Size: 946 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67735406 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)