chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

2022-操作系统深入学习

linux 底层原理

五种IO模型

https://www.jianshu.com/p/486b0965c296

运维

已知进程id, 怎么查看这个进程下所有线程, 怎么停止里面的线程

cpu

线程是怎么调度的?

https://blog.csdn.net/weixin_34314962/article/details/85959985
linux下 线程是一种特殊的进程;
所有的调度都是抢占式的:如果一个具有更高静态优先级的线程转换为可以运行了,那么当前运行的线程会被强制进入其等待的队列中。

I)线程默认的调度策略为SCHED_OTHER,并且最大和最小调度优先级都是0。

II)调度策略SCHED_FIFO和SCHED_RR的优先级范围为1到99,并且初始设置时对应的调度优先级初始值为0。

在Linux中,调度程序是一个叫schedule()的函数,该函数调用的频率很高,由它来决定是否要执行进程的切换,如果要切换的话,切换到那个进程等。那么在Linux中,在什么情况下要执行这个调度程序呢?我们把这种情况叫作调度时机。

Linux调度时机主要有:

I)进程状态转换的时刻:进程终止、进程睡眠(比如I/O阻塞就会导致这种情况),还比如进程调用sleep()或exit()等函数进行状态转换。

II)当前进程的时间片用完时。

III)设备驱动程序,当设备驱动程序执行长而重复的任务时,在每次反复循环中,驱动程序读检查是否需要调度,如果必要,则调用调度程序schedule()放弃CPU。

IV)进程从中断、异常及系统调用返回到用户态时。

页的概念,linux 中页的大小

Linux 会以页为单位管理内存,无论是将磁盘中的数据加载到内存中,还是将内存中的数据写回磁盘,操作系统都会以页面为单位进行操作,哪怕我们只向磁盘中写入一个字节的数据,我们也需要将整个页面中的全部数据刷入磁盘中。
4k windows中似乎也是的。

https://www.cnblogs.com/edisonchou/p/5094066.html

进程间的通讯方式

20220314153313

信号与信号量的区别

信号是通知进程产生了某个事件,信号量是用来同步进程的(用来调协进程对共享资源的访问的)

信号:是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。
信号量:信号量是一个特殊的变量,它的本质是计数器,信号量里面记录了临界资源的数目,有多少数目,信号量的值就为多少,进程对其访问都是原子操作(pv操作,p:占用资源,v:释放资源)。它的作用就是,调协进程对共享资源的访问,让一个临界区同一时间只有一个进程在访问它。

kill 原理

常用的信号如下:

1
2
3
4
5
6
7
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

kill -9 还有什么信号,kill -9 和 kill -15的区别

kill命令默认的信号就是15,首先来说一下这个默认的kill -15信号。

当使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该信号后,具体要如何处理是自己可以决定的。

这时候,应用程序可以选择:

1、立即停止程序
2、释放响应资源后停止程序
3、忽略该信号,继续执行程序
因为kill -15信号只是通知对应的进程要进行”安全、干净的退出”,程序接到信号之后,退出前一般会进行一些”准备工作”,如资源释放、临时文件清理等等,如果准备工作做完了,再进行程序的终止。

但是,如果在”准备工作”进行过程中,遇到阻塞或者其他问题导致无法成功,那么应用程序可以选择忽略该终止信号。

这也就是为什么我们有的时候使用kill命令是没办法”杀死”应用的原因,因为默认的kill信号是SIGTERM(15),而SIGTERM(15)的信号是可以被阻塞和忽略的。

和kill -15相比,kill -9就相对强硬一点,系统会发出SIGKILL信号,他要求接收到该信号的程序应该立即结束运行,不能被阻塞或者忽略。

kill -9也会带来很多副作用,如数据丢失等,所以,在非必要时,不要使用kill -9命令,尤其是那些web应用、提供RPC服务、执行定时任务、包含长事务等应用中,因为kill -9 没给spring容器、tomcat服务器、dubbo服务、流程引擎、状态机等足够的时间进行收尾。

僵尸进程与孤儿进程

一般来说,进程有五种状态:

创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行
执行状态:进程处于就绪状态被调度后,进程进入执行状态
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
20220314154613

在Linux内核里:
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z僵死状态(zombie):僵尸进程

僵尸进程: 父进程不知道儿子挂掉了。
当一个子进程结束运行(一般是调用exit、运行时发生致命错误或收到终止信号所导致)时,子进程的退出状态(返回值)会回报给操作系统,系统则以SIGCHLD信号将子进程被结束的事件告知父进程,此时子进程的进程控制块(PCB)仍驻留在内存中。一般来说,收到SIGCHLD后,父进程会使用wait系统调用以获取子进程的退出状态,然后内核就可以从内存中释放已结束的子进程的PCB;而如若父进程没有这么做的话,子进程的PCB就会一直驻留在内存中,也即成为僵尸进程.

孤儿进程:父进程没了,子进程还活着。
孤儿进程则是指当一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

线程间的同步方式、线程间的通信方式

https://www.jianshu.com/p/9218692cb209

临界区、互斥量、信号量、事件

使用全局变量、使用消息实现通信、使用事件CEvent类实现线程间通信

fork的底层实现方式

fork()系统调用通过复制一个现有进程来创建一个全新的进程。进程被存放在一个叫做任务队列的双向循环链表当中,链表当中的每一项都是类型为task_struct称为进程描述符的结构,也就是我们写过的进程PCB.

Tips:内核通过一个位置的进程标识值或PID来标识每一个进程。//最大值默认为32768,short int短整型的最大值.,他就是系统中允许同时存在的进程最大的数目。

当进程调用fork后,当控制转移到内核中的fork代码后,内核会做4件事情:
1、分配新的内存块和内核数据结构给子进程

2、将父进程部分数据结构内容拷贝至子进程

3、添加子进程到系统进程列表当中

4、fork返回,开始调度器调度

底层:https://blog.csdn.net/Dawn_sf/article/details/78709839

一个进程能创建的线程数量受到哪些制约?

在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址 空间的范围也不同。

虚拟内存大小:
64 位系统意味着用户空间的虚拟内存最大值是 128T,这个数值是很大的,如果按创建一个线程需占用 10M 栈空间的情况来算,那么理论上可以创建 128T/10M 个线程,也就是 1000多万个线程,有点魔幻!

在 32 位 Linux 系统里,一个进程的虚拟空间是 4G,内核分走了1G,留给用户用的只有 3G。

三个内核参数的大小,都会影响创建线程的上限:
/proc/sys/kernel/threads-max,表示系统支持的最大线程数,默认值是 14553;
/proc/sys/kernel/pid_max,表示系统全局的 PID 号数值的限制,每一个进程或线程都有 ID,ID 的值超过这个数,进程或线程就会创建失败,默认值是 32768;
/proc/sys/vm/max_map_count,表示限制一个进程可以拥有的VMA(虚拟内存区域)的数量,具体什么意思我也没搞清楚,反正如果它的值很小,也会导致创建线程失败,默认值是 65530。

32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。

说一下同步阻塞和异步非阻塞

同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。

异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。

阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。

非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

一颗CPU,两个协程,其中一个协程在死循环,会发生什么

要考虑主协程么:
https://blog.csdn.net/EDDYCJY/article/details/115410510

多线程处理问题你觉得开多少个线程

20220314171106

io多路复用复用的什么部分?

进程有哪些东西是线程没有的?

资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)

进程由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。
而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。

通信方式有些区别

指令重排是什么?

简单来说,就是指你在程序中写的代码,在执行时并不一定按照写的顺序。

缺页中断与缺页异常

会出现缺页异常的情况:
1.地址不在虚拟地址空间中
2.地址在虚拟地址空间中,但是其访问权限不够,例如写只读区间
3.还有和物理地址建立映射关系
4.映射的物理页已经不在内存中
5.映射的物理页访问权限不够
6.内核态下,通过vmalloc获取线性地址引起的异常,主要是因为延迟更新的问题,导致进程页表还没有更新

缺页异常的处理步骤:

陷入内核态。
保存用户寄存器和进程状态。
确定中断是否为缺页错误。
检查页面引用是否合法,并确定页面的磁盘位置。
从磁盘读入页面到空闲帧: . 在该磁盘队列中等待,直到读请求被处理。 . 等待磁盘的寻道或延迟时间。 . 开始传输磁盘页面到空闲帧。
在等待时,将 CPU 分配给其他用户(CPU 调度,可选)。
收到来自 I/O 子系统的中断(I/O 完成)。
保存其他用户的寄存器和进程状态(如果执行了第 6 步)。
确认中断是来自上述磁盘的。
修正页表和其他表,以表示所需页面现在已在内存中。
等待 CPU 再次分配给本进程。
恢复用户寄存器、进程状态和新页表,再重新执行中断的指令。

https://github.com/g0dA/linuxStack/blob/master/%E7%BC%BA%E9%A1%B5%E5%B0%8F%E8%AE%B0.md

缺页中断:
1、保护CPU现场
2、分析中断原因
3、转入缺页中断处理程序进行处理
4、恢复CPU现场,继续执行

换页

什么是缺页错误

https://www.sohu.com/a/406019130_115128

系统上下文切换与进程上下稳切换

进程切换分两步
1.切换页目录以使用新的地址空间。
2.切换内核栈和硬件上下文。

对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。所以明显是进程切换代价大

如何看 Linux 程序是多进程还是多线程的 ps PPID, PID?

下面的数据为db2数据库的db2sysc进程中所包括的线程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ps -eLf |grep db2sysc|grep -v grep

UID PID PPID LWP C NLWP STIME TTY TIME CMD
UID为User ID.

PID为process id,进程标识符

PPID为 parent process id,父进程标识符2,

LWP为light weight process or thread, 轻量级进程,即线程标识符

NLWP为,number of lwps(threads) in the process, 线程的数量

C CPU利用率,以整数表示。

PGID : 同一个分组 group 的进程
SID: 同一个上下文的 session 的进程

yum -y install psmisc安装pstree
pstree -p ps -e | grep server | awk '{print $1}' | wc -l

IO 密集型和 CPU 密集型如何分配线程优先级

cpu 密集型要高些

给子进程发一个kill信号,父进程能收到吗, 为什么

自己总结下:
kill 默认-15 会返回给父进程一个状态,不会成为僵尸进程。
如果是- 9立刻关闭,成为一个僵尸进程。

资源上是占用不了什么资源。但是通常系统的进程数量都是有限制的,如果有大量的僵尸进程占用进程号,导致新的进程无法创建,这个危害类似于占个坑,不办事。

如何控制并发,加什么锁,读写锁还是互斥锁

https://www.zhihu.com/question/66733477

内核态线程和用户态线程的区别如何切换

http://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E9%87%8D%E5%AD%A6%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E5%AE%8C/14%20%20%E7%94%A8%E6%88%B7%E6%80%81%E5%92%8C%E5%86%85%E6%A0%B8%E6%80%81%EF%BC%9A%E7%94%A8%E6%88%B7%E6%80%81%E7%BA%BF%E7%A8%8B%E5%92%8C%E5%86%85%E6%A0%B8%E6%80%81%E7%BA%BF%E7%A8%8B%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.md

用户态和内核态
用户空间中的代码被限制了只能使用一个局部的内存空间,我们说这些程序在用户态(User Mode) 执行。内核空间中的代码可以访问所有内存,我们称这些程序在内核态(Kernal Mode) 执行。

20220315102730

内核级线程有很多优势。
可以利用多核 CPU 优势:内核拥有较高权限,因此可以在多个 CPU 核心上执行内核线程。
操作系统级优化:内核中的线程操作 I/O 不需要进行系统调用;一个内核线程阻塞了,可以立即让另一个执行。

协程了解过吗?协程应用场景呢?有栈和无栈,以前实现过,linux用的那个ucontext族函数封装的

https://blog.csdn.net/qq_35423154/article/details/108064083

有名、无名管道有什么区别

无名管道(PIPE)和有名管道(FIFO)

无名管道是无名的,有名管道是有名的;
无名管道只能用于父子进程或兄弟进程之间的通信,而有名管道可用于任意两进程之间通信;
无名管道是无形的,即无名管道的 inode 结构不是在磁盘上存储的,而是临时生成的,而有名管道的 inode 结点在磁盘上。

写时复制了解吗,我说了下进程fork的copyonwrite相关的

一道设计题,给你10k个任务,其中1%低优先级任务,其他为高优先级任务,双核CPU如何调度最为高效。

内存

linux系统,32位系统,一个进程有4G的内存空间,从高地址到低地址分别放什么内容

虚拟内存,有什么好处

利用磁盘起到的缓存的作用,提高进程访问磁盘的速度。
虚拟内存可以为进程提供独立的内存空间,并通过动态链接库共享内存。
虚拟内存可以控制进程对物理内存的访问,隔离权限,提高系统安全性,

linux零拷贝有哪几种实现方式(mmap,sendfile)

https://blog.csdn.net/chunyusi1569/article/details/100821713

缺页中断?OS会干什么?linux系统怎么看缺页中断

缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤:
1、保护CPU现场
2、分析中断原因
3、转入缺页中断处理程序进行处理
4、恢复CPU现场,继续执行

但是缺页中断是由于所要访问的页面不存在于内存时,由硬件所产生的一种特殊的中断,因此,与一般的中断存在区别:
1、在指令执行期间产生和处理缺页中断信号
2、一条指令在执行期间,可能产生多次缺页中断
3、缺页中断返回是,执行产生中断的一条指令,而一般的中断返回是,执行下一条指令。

查看缺页中断:
1.读取 /proc/stat 文件中 intr 中断字段后的第 16 项内容(不准)
2.修改内核源代码实现缺页统计

https://autubrew.me/2018/05/linux%E4%B8%8B%E7%BC%BA%E9%A1%B5%E6%AC%A1%E6%95%B0%E7%BB%9F%E8%AE%A1/

了解内存泄漏吗?有什么危害?举个goroutine泄漏的例子?

内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。

一次内存泄漏的危害可以忽略不计,但是内存泄漏堆积则后果很严重,无论多少内存,迟早会被占完,造成内存泄漏。

1、频繁GC:系统分配给每个应用的内存资源都是有限的,内存泄漏导致其他组件可用的内存变少后,一方面会使得GC的频率加剧,再发生GC的时候,所有进程都必须等待,GC的频率越高,用户越容易感应到卡顿。另一方面内存变少,可能使得系统额外分配给该对象一些内存,而影响整个系统的运行情况。

2、导致程序运行崩溃:一旦内存不足以为某些对象分配所需要的空间,将会导致程序崩溃,造成体验差。

goroutine leak往往是由于协程在channel上发生阻塞,或协程进入死循环,特别是在一些后台的常驻服务中。 在使用channel和goroutine时要注意:

创建goroutine时就要想好该goroutine该如何结束
使用channel时,要考虑到channel阻塞时协程可能的行为
要注意平时一些常见的goroutine leak的场景,包括:master-worker模式,producer-consumer模式等等。

虚拟内存说一下,会不会对 GC 造成影响?

程序创建对象等引用类型实体时会在虚拟内存中分配给它们一块内存空间,如果该内存空间不再被任何引用变量引用时就成为需要被回收的垃圾。操作系统会记录一个进程运行时的所占用的内存、CPU和寄存器等资源,当进程结束后便由操作系统能够自动回收资源。但是对于一个运行较长时间的程序,如果使用完内存资源后没有及时释放就会造成内存泄漏甚至系统错误。

一个程序申请内存时,会做哪些操作?

中断,页面置换,堆,栈等。

MMU

https://zhuanlan.zhihu.com/p/354142930

文件系统

linux文件存储结构

inode:文件大小、组信息、权限信息等
软连接 硬链接

页表储存?文件映射?Cache结构?

io多路复用,select\poll\epoll的实现和区别

页式存储和段式存储的区别以及作用

虚拟地址和物理地址的联系

IO多路复用(epoll,select的区别)

IO模型了解吗?讲下select/poll/epoll?各自优劣、底层实现、使用场景?

缓存一致性问题怎么解决的优劣呢?

边缘触发和水平触发区别,边缘触发的IO应该怎么写

小文件频繁读写会有什么现象?

内存占用大,主要表现在cache上占用多;
磁盘的io次数过多,磁盘的随机iops时瓶颈。

对于海量小文件应用,常见的I/O流程复杂也是造成磁盘性能不佳的原因。对于小文件,磁盘的读写所占用的时间较少,而用于文件的open()操作占用了绝大部分系统时间,导致磁盘有效服务时间非常低,磁盘性能低下。针对于问题的根源,优化的思路大体上分为:

1.针对数据布局低效,采用小文件合并策略,将小文件合并为大文件。
2.针对元数据管理低效,优化元数据的存储和管理。针对这两种优化方式,业内也出现了许多优秀的开源软件。

https://blog.csdn.net/u010363590/article/details/82984155
https://tech.meituan.com/2017/05/19/about-desk-io.html

内核

linux内核了解了多少

shell

这个命令可以从大文件中截取某个时间段的内容

sed -n '/Accessing Time:2013-07-05 23:30/,/Accessing Time:2013-07-05 23:59/'p 75.txt > 30.txt

linux常用命令罗列一下

用netstat看tcp连接的时候有关注过time_wait和close_wait吗?

ss 与 netstat 有什么区别

ss比netstat快的主要原因是,netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多。
当服务器的socket连接数量非常大时(如上万个),无论是使用netstat命令还是直接cat /proc/net/tcp执行速度都会很慢,相比之下ss可以节省很多时间。ss快的秘诀在于,它利用了TCP协议栈中tcp_diag,这是一个用于分析统计的模块,可以获得Linux内核中的第一手信息。如果系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍微慢但仍然比netstat要快。

linux查看磁盘、io、内存情况的命令

磁盘I/O性能评估命令:iostat -xdk 2 3
2秒间隔3次

磁盘块设备分布
rkB/s每秒读取数据量kB;
wkB/s每秒写入数据量kB;
svctm I/O请求的平均服务时间,单位毫秒;
await I/O请求的平均等待时间,单位毫秒;值越小,性能越好;
util一秒中有百分几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需要优化程序或者增加磁盘;
rkB/s、wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。
svctm的值与await的值很接近,表示几乎没有/O等待,磁盘性能好,
如果await的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁盘。

查端口用什么命令?lsof查不到的话用什么命令?

20220315203909

ss -lnp|grep 4567

批量查看

ss -ant |awk ‘$4~/192.168.20.231:7[5-6]/ {print $0}’

netstat -tunlp | grep 端口号

系统上有个大文件,但是不知道文件的名字和路径,在当前用户的用户空间下,如何找到他?

find . -type f -size +800M

查找Linux下的大目录

du -h –max-depth=1

m 单位
du -hm –max-depth=2 | sort -n

最大12个
du -hm –max-depth=2 | sort -nr | head -12

看cpu负载用什么命令

中断

中断处理程序的上部分和下半部可以理解为:

上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的工作,特点是快速执行;
下半部是由内核触发,也就说软中断,主要是负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行;

中断种类

软中断包括了 10 个类型,分别对应不同的工作类型,比如 NET_RX 表示网络接收中断,NET_TX 表示网络发送中断、TIMER 表示定时中断、RCU 表示 RCU 锁中断、SCHED 表示内核调度中断。BLOCK、BLOCK_IOPOLL、TASKLET、HRTIMER

如果要知道是哪种软中断类型导致的,我们可以使用 watch -d cat /proc/softirqs 命令查看每个软中断类型的中断次数的变化速率。
20220315210501
一般对于网络 I/O 比较高的 Web 服务器,NET_RX 网络接收中断的变化速率相比其他中断类型快很多。

如果发现 NET_RX 网络接收中断次数的变化速率过快,接下里就可以使用 sar -n DEV 查看网卡的网络包接收速率情况,然后分析是哪个网卡有大量的网络包进来。

20220315210818
系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
0.0 wa 等待输入输出的CPU时间百分比/cpu等待磁盘写入完成时间
0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比
0.0 si 软中断(Software Interrupts)占用CPU的百分比
0.0%st:虚拟机占用百分比

如果一台机器看到wa特别高,那么一般说明是磁盘IO出现问题,可以使用iostat等命令继续进行详细分析。

看io用什么命令

yum install sysstat
iostat -d -k 2
20220315223926

1
2
3
4
5
6
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。

kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

20220315224050

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,
FS会将这个请求合并Merge);
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。

rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,
      则表示I/O队列等待太长,
      系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,
    而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,
    所以该参数暗示了设备的繁忙程度
    。一般地,如果该参数是100%表示设备已经接近满负荷运行了
    (当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了

如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈

svctm: 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,

如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。

https://blog.csdn.net/kwame211/article/details/111227231

CICD主要做了什么?

场景题:使用top命令观察一个主动malloc申请了1g内存的进程

写一个会爆栈的代码

内存有限,如何寻找两个大文件中同样的行

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道