Linux性能调优之内核篇

进程管理

进程

进程管理是操作系统一个重要的内容,包括进程调度,中断管理,信号,进程优先级,进程状态和切换,进程内存管理等各个方面。进程是可执行文件在系统中的执行实例,内核中的表达为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每秒大小
Built with Hugo
主题 StackJimmy 设计