进程管理
进程
进程管理是操作系统一个重要的内容,包括进程调度,中断管理,信号,进程优先级,进程状态和切换,进程内存管理等各个方面。进程是可执行文件在系统中的执行实例,内核中的表达为task_struct
,包含了进程的所有信息。
进程可通过fork一份相同的进程,具有fork之前完全一样的状态。fork的性能在 60-8000/s。之所以有这么大的跨越,在于不同的进程使用了不同数量的页表,如果进程使用内存很少,页表数量很少,fork的性能便会很高,如果进程映射的内存很多,页表数量很多,fork虽然由于写时复制的优化,可以不进行内存的复制,但还是需要复制页表,会导致性能急剧下降。
而单CPU的进程之间的切换性能,在30w-100w/s之间。K级以上并发,稳定在30w/s左右。
更加详细的内容可查阅Linux内核代码,进程调度。
线程
线程可以认为是更轻量级的进程,线程与进程的区别在于线程之间可共享资源,除了栈空间独享以外,其他的资源如内存空间,文件,都可以共享。
线程可通过pthread_create
创建,由于共享内存等资源,所以性能会更高,创建性能在5w-10w/s,随着并发数的增加而降低,并发1w创建性能会稳定在5w/s。
线程切换的效率,单CPU切换在50w-150w之间,K级以上并发,稳定在50w/s左右。
中断
进程管理中,中断也是非常重要的一个方面,目前的中断信息,可通过虚拟文件系统/proc/interrupt
查看。对于多核CPU,之前的内核版本有出现过中断在一个CPU,处理网络包导致单CPU过载的情况。
函数调用
函数调用分为两种,一种有系统调用,跟普通函数调用的区别在于系统调用会进行内核态和用户态的切换,性能略有下降,以架构师的水准要求自己,需要了解主要函数调用的瓶颈。
函数 | 性能(次/S) |
---|---|
ntohl | 2.5亿 |
memset 1k | 150w |
getppid | 1000w |
getimeofday | 30w-400w |
socket | 10w-50w |
sendto | 40w |
更详细系统调用相关内容,可参考:系统调用。
文件系统
文件系统是一个复杂的系统,其包含的模块也非常丰富,对于性能来讲,需要了解的是文件系统和硬件之间有一层 Page Cache,当读写文件时,并不一定非要从磁盘读取,如果 Page Cache 中存在,直接操作Cache层,性能会有大幅提高。但同时存在的一个问题是,如果只写入Cache层,当系统宕机后写入的内容将会丢失,内核启用pdflush进程进行后台回写,当到达一定条件就把Cache层的变更写入硬件,系统函数fsync
可以把更改写入磁盘,对数据安全性要求非常高的模块,就必须更改完成后调用fsync
把数据刷入磁盘硬件,当然,由于绕过了Cache系统,性能会大幅下降,而且会造成系统性能的不稳定。
在’/proc/vm’文件系统下,有参数进行设置系统执行pdflush的执行条件。dirty_background_ratio
表示脏页占内存多少比例时,开始进行回收。dirty_expire_centisecs
表示当脏页存在多长时间以后回收。
系统指标
Linux系统可以查看各种执行参数,不同的参数对应不同子系统的性能状况,了解哪些参数是需要了解的,哪些参数对应的含义,是了解当前系统执行性能必须要了解的,下面逐一查看各项指标的含义。
CPU
判别CPU当前执行效能,可通过以下指标查看:
- CPU利用率:CPU利用率直接体现了CPU使用情况,长期处于80%到90%以上,可能CPU出现瓶颈
- 用户态时间:展现了CPU用户态的执行时间
- 系统时间:展现了内核态执行时间
- Waiting:等待时间,如果出现大量的等待,IO可能出现瓶颈
- Context switch:上下文切换
- Interrupts:中断
- Load average:等待CPU的进程队列大小
内存
- 空闲内存
- swap使用大小
- Buffer和Cache大小
- Slabs 大小
网络
- 收包和发包量
- 收包和发包大小
- 丢包量
磁盘
- iowait,CPU等待IO时间
- 平均等待时间
- 执行时间
- write和read每秒次数
- write和read每秒大小