linux 内核态 线程,Linux内核线程记录

在 Linux 中,用户态进程的“祖先”,都是 PID 号为 1 的 init 进程。

现在主流的 Linux 发行版中,init 都是 systemd 进程;而其他的用户态进程,会通过 systemd 来进行管理。

Linux 中的各种进程,除了用户态进程外,还有大量的内核态线程。那么,内核态线程又是谁来管理的呢?

实际上,Linux 在启动过程中,有三个特殊的进程,也就是 PID 号最小的三个进程。0 号进程为 idle 进程,这也是系统创建的第一个进程,它在初始化 1 号和 2 号进程后,演变为空闲任务。当 CPU 上没有其他任务执行时,就会运行它(swapper->空闲任务,当系统中没有任务时,perf追踪可以看到其使用率为99%)。

1 号进程为 init 进程,通常是 systemd 进程,在用户态运行,用来管理其他用户态进程。

2 号进程为 kthreadd 进程,在内核态运行,用来管理内核线程。

常用的内核线程:kswapd0:根据页低阈值(min_free_bytes)的配置,定期回收内存

ksoftirqd:处理软中断的内核线程,每个CPU都有一个,当看到此线程对CPU使用率较高时,意味着系统在进行大理的软中断操作,性能会有问题

kworker:用于执行内核工作队列,分为绑定 CPU (名称格式为 kworker/CPU86330)和未绑定 CPU(名称格式为 kworker/uPOOL86330)两类。

migration:在负载均衡过程中,把进程迁移到 CPU 上。每个 CPU 都有一个 migration 内核线程。

pdflush:用于将内存中的脏页(被修改过,但还未写入磁盘的文件页)写入磁盘(已经在 3.10 中合并入了 kworker 中)。

jdb2/磁盘设备号1-8:jbd 是 Journaling Block Device 2的缩写,用来为文件系统提供日志功能,以保证数据的完整性;比如sda1-8,表示磁盘分区名称和设备号。每个使用了 ext4 文件系统的磁盘分区,都会有一个 jbd2 内核线程。jdb2工作原理:文件系统写入数据,要提交给驱动程序,而 jbd2 就是在文件系统调用驱动之前工作的。文件系统要先调用 jbd2,然后 jbd2 会根据系统的设置(设置有 writeback、ordered、journal),进行数据的备份,然后再让文件系统提交数据。当文件系统将数据写入了块设备之后,jbd2 就会把备份的数据删除。如果文件系统写块设备时出了问题(比如说可悲的断电),那 jbd2 这里还有一个备份,在进行完整性检查时就会把数据补全,所以数据不会丢。

jbd2 有一个参数 barrier,它用来开启磁盘屏障。就是设置一个栅栏,要先把 barrier 之前的数据全都写到磁盘设备之后,才会写 barrier 之后的数据,也就是说它是用来保证原子操作中数据的完整性的。当然,开启 barrier 的一个后果就是性能下降。当jdb2内核线程使用率较高,导致CPU的wait使用率较高时,可以考虑关闭磁盘的此功能;

关掉barrier方法:挂载磁盘时指定选项:-o barrier=0 或者 nobarrier

注:当内核线程使用CPU较高时,可以使用perf对其进行追踪分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值