LinuxCPU达到瓶颈,怎样优化?
软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号 2. 优化方法 2.1 CPU 使用率 CPU 使用率描述了非空闲时间占总 CPU 时间的百分比,根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等。 用户 CPU 使用率,包括用户态 CPU 使用率(user) 和低优先级用户态 CPU 使用率 (nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙。 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙。 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长。 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,通常说明系统发生了大量的中断。 2.2 平均负载(Load Average) 平均负载,也就是系统的平均活跃进程数,它反映了系统的整体负载情况,主要包括三个数值,分别指过去 1 分钟、过去 5 分钟和过去 15 分钟的平均复制子。 理想情况下,平均负载等于逻辑 CPU 个数,这表示每个 CPU 都恰好被充分利用。如果平均负载大于逻辑 CPU 个数,就表示负载比较重了。 2.3 进程上下文切换 无法获取资源而导致的自愿上下文切换。 被系统强制调度导致的非自愿上下文切换。 2.4 CPU 缓存的命中率 由于 CPU 发展的速度远快于内存的发展, CPU 的处理速度就比内存的访问速度快得多。这样,CPU 在访问内存的时候,免不了要等待内存的响应。为了协调这两者巨大的性能差距,CPU 缓存(通常是多级缓存)就出现了。 根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 常用在单核中,L3 则用在多核中。 从 L1 到 L3,三级缓存的大小依次增大,相应的,性能依次降低(当然比内存还是好 得多)。而它们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则表示性能越好。 2.5 tcmalloc 替换 ptmalloc 2.5.1 ptmalloc Ptmalloc 采用主-从分配区的模式,当一个线程需要分配资源的时候,从链表中找到一个没加锁的分配区,在进行内存分配。 小内存分配 在 ptmalloc 内部,内存块采用 chunk 管理,并且将大小相似的 chunk 用链表管理,一个链表被称为一个 bin。前 64 个 bin 里,相邻的 bin 内的 chunk 大小相差 8 字节,称为 small bin,后面的是 large bin,,large bin 里的 chunk 按先大小,再最近使用的顺序排列,每次分配都找一个最小的能够使用的 chunk。 Chunk 的结构如上所示,A 位表示是不是在主分配区,M 表示是不是 mmap 出来的,P 表示上一个内存紧邻的 chunk 是否在使用,如果没在使用,则 size of previous chunk 是上一个 chunk 的大小,否则无意义(而且被用作被分配出去的内存了),正式根据 P 标记位和 size of previous chunk 在 free 内存块的时候来进行 chunk 合并的。当然,如果 chunk 空闲,mem 里还记录了一些指针用于索引临近大小的 chunk 的,实现原理就不复述了,知道大致作用就行。 在 free 的时候,ptmalloc 会检查附近的 chunk,并尝试把连续空闲的 chunk 合并成一个大的 chunk,放到 unstored bin 里。但是当很小的 chunk 释放的时候,ptmalloc 会把它并入 fast bin 中。同样,某些时候,fast bin 里的连续内存块会被合并并加入到一个 unsorted bin 里,然后再才进入普通 bin 里。所以 malloc 小内存的时候,是先查找 fast bin,再查找 unsorted bin,最后查找普通的 bin,如果 unsorted bin 里的 chunk 不合适,则会把它扔到 bin 里。 大内存分配 Ptmalloc 的分配的内存顶部还有一个 top chunk,如果前面的 bin 里的空闲 chunk 都不足以满足需要,就是尝试从 top chunk 里分配内存。如果 top chunk 里也不够,就要从操作系统里拿了。 还有就是特别大的内存,会直接从系统 mmap 出来,不受 chunk 管理,这样的内存在回收的时候也会 munmap 还给操作系统。 简而言之,就是: 小内存: [获取分配区(arena)并加锁] -> fast bin -> unsorted bin -> small bin -> large bin -> top chunk -> 扩展堆 大内存: 直接 mmap 总结 释放的时候,几乎是和分配反过来,再加上可一些 chunk 合并和从一个 bin 转移到另一个 bin 的操作。并且如果顶部有足够大的空闲 chunk,则收缩堆顶并还给操作系统。 介于此,对于 ptmalloc 的内存分配使用有几个注意事项: 1. Ptmalloc 默认后分配内存先释放,因为内存回收是从 top chunk 开始的。 2. 避免多线程频繁分配和释放内存,会造成频繁加解锁。 3. 不要分配长生命周期的内存块,容易造成内碎片,影响内存回收。 2.5.2 Tcmalloc 具体实现原理不加以赘述,可自行百度学习之,总结以下特点。 · Tcmalloc 占用更少的额外空间。例如,分配 N 个 8 字节对象可能要使用大约 8N * 1.01 字节的空间。即,多用百分之一的空间。Ptmalloc2 使用最少 8 字节描述一个 chunk。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |