共计 2738 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | 在日常的运维工作中,当我们习惯性的执行 ps 命令后会看到很多“奇奇怪怪”的进程,而这些进程大部门都是系统的内核进程。很多同学对之了解的甚少,因此今天就为大家整理一篇入门级的系统进程介绍帖,希望能够帮助大家对操作系统进程的理解。 |
在日常的运维工作中,当我们习惯性的执行 ps 命令后会看到很多“奇奇怪怪”的进程,而这些进程大部门都是系统的内核进程。很多同学对之了解的甚少,因此今天就为大家整理一篇入门级的系统进程介绍帖,希望能够帮助大家对操作系统进程的理解。
在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高。而且总是会听到业务线同学询问“xxx 这个是啥进程啊?咋开启了这么多?”
而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些系统的辅助功能(如将缓存写入磁盘);无括号的进程都是用户们执行的进程(如 php、nginx 等)。
如下图所示:
下面就为大家普及 10 个比较常见的系统进程:
kswapd0
kjournald
pdflush
kthreadd
migration
watchdog
events
kblockd
aio
rpciod
系统每过一定时间就会唤醒 kswapd,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有 2 个阀值,pages_hige 和 pages_low, 当空闲内存页的数量低于 pages_low 的时候,kswapd 进程就会扫描内存并且每次释放出 32 个 free pages, 直到 free page 的数量到达 pages_high.
journal:记录所有文件系统上的元数据改变, 最慢的一种模式。
ordered:默认使用的模式, 只记录文件系统改变的元数据,并在改变之前记录日志。
writeback:最快的一种模式, 同样只记录修改过的元数据, 依赖标准文件系统写进程将数据写到硬盘
pdflush 用于将内存中的内容和文件系统进行同步。
比如说:当一个文件在内存中进行修改,pdflush 负责将它写回硬盘。每当内存中的垃圾页(dirty page)超过 10% 的时候,pdflush 就会将这些页面备份回硬盘。这个比率是可调节的,通过 /etc/sysctl.conf 中的 vm.dirty_background_ratio 项默认值为 10 也可以。
这种内核线程只有一个,它的作用是管理调度其它的内核线程。
它在内核初始化的时候被创建,会循环运行一个叫做 kthreadd 的函数,该函数的作用是运行 kthread_create_list 全局链表中维护的 kthread。可以调用 kthread_create 创建一个 kthread,它会被加入到 kthread_create_list 链表中,同时 kthread_create 会 weak up kthreadd_task。kthreadd 在执行 kthread 会调用老的接口——kernel_thread 运行一个名叫“kthread”的内核线程去运行创建的 kthread,被执行过的 kthread 会从 kthread_create_list 链表中删除,并且 kthreadd 会不断调用 scheduler 让出 CPU。这个线程不能关闭。
这种内核线程共有 32 个,从 migration/ 0 到 migration/31,每个处理器核对应一个 migration 内核线程,主要作用是作为相应 CPU 核的迁移进程,用来执行进程迁移操作,内核中的函数是 migration_thread()
属于 2.6 内核的负载平衡系统,该进程在系统启动时自动加载(每个 cpu 一个),并将自己设为 SCHED_FIFO 的实时进程,然后检查 runqueue::migration_queue 中是否有请求等待处理,如果没有,就在 TASK_INTERRUPTIBLE 中休眠,直至被唤醒后再次检查。migration_thread() 仅仅是一个 CPU 绑定以及 CPU 电源管理等功能的一个接口。这个线程是调度系统的重要组成部分。
这种内核线程共有 32 个,从 watchdog/ 0 到 watchdog/31, 每个处理器核对应一个 watchdog 内核线程,watchdog 用于监视系统的运行,在系统出现故障时自动重新启动系统,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。
在 Linux 内核下, watchdog 的基本工作原理是:当 watchdog 启动后(即 /dev/watchdog 设备被打开后),如果在某一设定的时间间隔(1 分钟)内 /dev/watchdog 没有被执行写操作, 硬件 watchdog 电路或软件定时器就会重新启动系统,每次写操作会导致重新设定定时器。
这种内核线程共有 32 个,从 events/ 0 到 events/31, 每个处理器核对应一个 events 内核线程。用来处理内核事件很多软硬件事件 (比如断电,文件变更) 被转换为 events,并分发给对相应事件感兴趣的线程进行响应。
这种内核线程共有 32 个,从 kblockd/ 0 到 kblockd/31, 每个处理器核对应一个 kblockd 内核线程。用于管理系统的块设备,它会周期地激活系统内的块设备驱动。如果拥有块设备,那么这些线程就不能被去掉。
这种内核线程共有 32 个,从 aio/ 0 到 aio/31, 每个处理器核对应一个 aio 内核线程, 代替用户进程管理 I /O,用以支持用户态的 AIO(异步 I /O),不应该被关闭。
这种内核线程共有 32 个,从 rpciod/ 0 到 rpciod/31, 每个处理器核对应一个 rpciod 内核线程, 主要作用是作为远过程调用服务的守护进程,用于从客户端启动 I / O 服务,通常启动 NFS 服务时要用到它。
进程是操作系统上非常重要的概念,所有系统上面跑的数据都会以进程的类型存在。在 Linux 系统当中:触发任何一个事件时,系统都会将它定义成为一个进程,所以,进程是 Linux 程序的唯一的实现方式。