摘要:测试用例:在非cpu0上绑定执行两个耗cpu的进程,top -1查看系统软中断占比,发现cpu0的软中断占比升高。 原因排查: 查看/proc/softirqs,显示SCHED softirq增长很快。SCHED softirq负责负载均衡。负载均衡分为三种,周期性balance,nohz bala
阅读全文
摘要:如果开启了nohz,在busy的cpu上,每次时钟中断的时候会发起nohz load balance。它的一个关键点是选择一个idle cpu。 static void nohz_balancer_kick(struct rq *rq) { ... out: if (flags) kick_ilb(
阅读全文
摘要:在本系列第二篇中,我们讲到,如果在sched_balance_rq中没能成功迁移进程,进而需要active balance,那么会让migration线程去进行更激进的线程迁移。本篇来介绍下migration线程。 在linux系统中使用ps aux | grep migration,我们会看到一系
阅读全文
摘要:有三种情况需要为task选择cpu:刚创建的进程(fork),刚exec的进程(exec),刚被唤醒的进程(wakeup)他们都会调用select_task_rq,对于cfs,就是select_task_rq_fair。 static int select_task_rq_fair(struct t
阅读全文
摘要:linux的负载均衡是一个很负载的过程,本篇讲一下触发负载均衡的流程,下一篇具体讲load balance流程。 负载均衡是kernel调度一个重要的方面,下面是三篇博客,讲得很好。 CFS任务的负载均衡(概述) (wowotech.net) CFS任务的负载均衡(任务放置) (wowotech.n
阅读全文
摘要:这里有一篇文章讲得很好:http://www.wowotech.net/process_management/load_balance_function.html 我们以6.13-rc2作为基础来分析。 上一篇讲到了触发负载均衡的三种方式:newilde balance,nohz idle bala
阅读全文
摘要:这里有一篇很好的博客宋宝华:论Linux的页迁移(Page Migration)完整版-CSDN博客 为什么需要页面迁移?试想系统在经过长时间运行,内存块趋于碎片化,想要分配一块大的连续内存已经不可能了。此时并非没有足够的内存,而只是内存碎片化。这个时候如果可以是已经分配的内存聚集在一起就可以得到大
阅读全文
摘要:本篇了解一下内核是怎样触发页面回收的。 触发内存回收的方式有两种,同步和异步回收。alloc_pages在分配内存的时候,如果内存短缺会主动回收内存,这是同步回收;内核有一个或多个kswapd内核线程负责在后台回收内存,这是异步。 看一下shrink_active_list static void
阅读全文
摘要:这里有一篇博客讲的不错。linux内存管理笔记(三十八) 反向映射_linux 反向映射-CSDN博客 页表是把虚拟地址映射到物理页面,但是如何根据一个物理页找到所有映射它的pte呢?答案是用反向映射Reverse Mapping(RMAP)。这在页面回收中很有用。回收页面需要将到物理页的映射断开(
阅读全文
摘要:参考《深入理解linux内核架构》和这篇博客Linux中的内存回收 [一] - 知乎 (zhihu.com) 内核代码v6.8-rc2 内存在计算机系统中经常是稀缺资源,当系统中内存不足甚至耗尽,为了让系统继续运行必须回收一部分内存。 为了回收内存,我们必须首先知道系统中的内存都处于什么状态。内存中
阅读全文
摘要:malloc是常用的用户态分配内存的接口,它会调用brk系统调用来请内存分配内存。下面看看该系统调用的实现。 插一句,每次调用malloc的时候未必都会调用brk去从kernel分配实际的内存,因为每次系统调用都是有开销的,为了避免频繁的陷入内核,malloc会多申请一部分内存当作内存池,之后要申请
阅读全文
摘要:在fork进程的时候子进程会共享父进程的页表,但并没有分配新页。此时页表时只读的,如果父进程或者子进程写内存就会触发page fault,内核会重新分配内存更改页表,从此分道扬镳。因此写时复制包含两部分内容,第一是fork进程时复制页表并设置pte为只读,第二是写内存发生page fault。 先来
阅读全文
摘要:folio大概是5.16引入的,看起来像是page的封装,这里有一篇讲解folio很好的博客,论好名字的重要性: Linux内核page到folio的变迁-CSDN博客 struct folio { /* private: don't document the anon union */ union
阅读全文
摘要:分析一下缺页的处理。缺页的意思是在访问内存的时候该地址还没有建好页表,页面尚未分配,或者页面被swap出去或者没有权限。缺页是同步异常,用户态发生缺页异常会等待内核解决,当然这一切对于用户态都是透明的。缺页处理的核心函数是do_page_fault,这个函数是架构相关的所以这个函数分布在各个架构相关
阅读全文
摘要:个人笔记,谨慎观看. 先看看vmalloc是怎么实现的。它能在非连续物理内存之上建立连续的虚拟内存映射。这里有一篇博客Linux内存管理 (6)vmalloc - ArnoldLu - 博客园 (cnblogs.com) 调用链vmalloc->_vmalloc_node->_vmalloc_nod
阅读全文
摘要:从这一篇开始记录以下我看有关内存管理的内核代码的笔记. 内容很长,很多是我自己的理解,请谨慎观看. 伙伴系统的工作的基础是物理页的组织,组织结构有小到大依次为page->zone->node。下面从源码里看看各个结构是如何组织的。 typedef struct pglist_data { struc
阅读全文
摘要:简单一点,写一个字符设备驱动。 首先我们希望在/dev下面出现一个新的字符设备文件。 1. 分配一个设备号; int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name); 示
阅读全文
摘要:linux系统中,sysfs导出了很多系统硬件信息。cpu的拓扑即在其中。 cpu相关的拓扑信息位于/sys/devices/system/cpu下。 # ls /sys/devices/system/cpu cpu0 cpu1 cpufreq cpuidle crash_hotplug isola
阅读全文
摘要:在一台机器上测试spec。发现性能很差。使用top去看,发现cpu可以占满,但即便能占用大量cpu资源吞吐量却上不去。使用perf stat去看。 # perf stat -a -p 946806 PID/TID switch overriding SYSTEM ^C Performance cou
阅读全文
摘要:如果服务器上有多个numa节点,访问不同numa的性能有较大的性能损失,这里提供一种测试跨numa带宽的方法。 测试工具使用lmbench,github链接:https://github.com/intel/lmbench.git clone编译好之后可以在bin下找到所有可用的子命令。可以使用下面
阅读全文