步骤记录
- 前言
- 一、查看环境配置
- 二、LRU缓存空间调整
- 三、进程扫描时间间隔
- 四、与其他内核对比的工作负载测试(另一个内核的编译)
- 总结
前言
记录的相关操作有:查看服务器硬件环境、LRU缓存大小修改、内核命名、内核编译以及进程执行周期的设置。
一、查看环境配置
可以在Ubuntu的设置中看到磁盘、DRAM总量、以及CPU型号。
关于服务器插槽的信息,使用http://t.csdn.cn/Svm34
提到的命令或者http://t.csdn.cn/XcKyi
补充:dmidecode命令主要是通过DMI获取主机的硬件信息,通常是在不打开计算机机箱的情况下使用该命令来查找硬件详细信息。其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。
二、LRU缓存空间调整
页面会在active和inactice链表中来回移动,如果每次移动都进行操作,那就意味着要获取node节点的自旋锁,竞争非常大,因此引入LRU缓存。就是积累一定数量的页面后再操作。LRU缓存默认批处理页面数为15。新页面加入LRU链表主要通过lru_cache_add
函数,当lru缓存满了之后,就通过__pagevec_lru_add
去实际将页面放入对应lru链表。内核线程kswapd
会周期性地把active list中符合条件的页面移到inactive list中,这项转移工作是由refill_inactive_zone()
完成的。
src/include/linux/pagevec.h/ #define PAGEVEC_SIZE 15
当修改改了一个新的内核,需要去取个名字区别开时,有两处地方可以改名字。
在src文件夹里的Makefile文件如图2-5行组成了内核的命名
在.config文件里修改的CONFIG_LOCALVERSION
内容会成为在Makefile文件里修改的名字的后缀,就是添加在那个名字后面
三、进程扫描时间间隔
https://cloud.tencent.com/developer/article/1725931 这篇讲解了内核时间管理相关的内容。
周期性事件是由系统的系统定时器驱动的,内核必须在硬件定时器的帮助下才能计算和管理时间。在i386平台上,目前采用的HZ值是1000。不同的体系结构其HZ值是不一样的,比如arm就采用100。如果在驱动中要使用系统的中断频率,直接使用HZ,而不要用100或1000.一个HZ被认为1s.
等待队列实际上就是一个进程链表,链表中包含了等待某个特定事件的所有进程。使用等待队列也可以实现长延迟。在延迟期间,当前进程在等待队列中睡眠。休眠也是基于等待队列实现的,wait_event系列函数,wake_up_interruptible这个是kswap线程的,和wait_event_interruptible一起用于休眠。
要想把进程加入等待队列,驱动首先要在模块中声明一个等待队列头,并将它初始化。在作者修改的代码中可以找到动态初始化:
wait_queue_head_t kpromoted_wait; //这句是添加到NUMA node结构体里的。
#ifdef CONFIG_MULTICLOCK
init_waitqueue_head(&pgdat->kpromoted_wait); //在page_alloc文件中
#endif
http://blog.chinaunix.net/uid-7332782-id-3217821.html 在这篇博客里提到:
prepare_to_wait()和finish_wait()并不是进程睡眠的地方,进程睡眠的地方是schedule()。prepare_to_wait()只是进行一些链表的操作,以确保自己在等待队列中。进程在确信自己已经在队列中后,再次检查条件,这里如果不检查,可能条件已经满足,直接去睡眠的话,可能再也没有人来唤醒它了。
https://blog.csdn.net/u013910383/article/details/121366819 schedule_timeout
函数分析将当前task调度出cpu,并根据传入的timeout决定何时重新调度。所以对进程扫描时间间隔的测试要修改的参数就是几倍HZ了。
四、与其他内核对比的工作负载测试(另一个内核的编译)
每次报错后重新开始内核编译都需要:
sudo make mrproper
sudo make clean
然后从sudo make xconfig
这一步重来!
nimble的内核竟然在第一步报错:没有规则可制作目标scripts/Makefile.lib。去查看后确实对比multi-clock的内核编译文件,少了这一个,而且静态分层那个内核也少了。但是由于没有添加新的文件,只是在修改原有文件,因此搬过去用也没问题。
让我们看看这个文件是干啥的:如果说 Makefile.build 负责执行 make 的编译过程,而 Makefile.lib 则决定了哪些文件需要编译,哪些目录需要递归进入。http://cxd2014.github.io/2015/11/11/Linux-Makefile/ 一篇不错的解析
从之后的编译情况来看,Makefile.modbuiltin这个文件也是没有的……也要提前移过去。经过比较之后这四个文件都是需要移过去的。
之后就是参考readme来配置.config文件了。
Enable Enable Nimble Page Selection for Tiered Memory System
to compile the MULTI-CLOCK kernel.(搜索nimble即可)
Following are the other required configurations need to be eanbled for MULTI-CLOCK:
allow for memory hot-add
Device memory (pmem, HMM, etc...) hotplug support
NVDIMM (Non-Volatile Memory Device) Support --->
(搜索NVDIMM即可)NVDIMM DAX: Raw access to persistent memory
DAX: direct access to differentiated memory --->
(搜索pmem即可)Device DAX: direct access mapping device
PMEM DAX: direct access to persistent memory
KMEM DAX: volatile-use of persistent memory
因为第1、2个选项没有搜索到,所以下面给出具体位置(但其实本来就是打勾的)
sudo gedit .config
然后用Ctrl+F搜索CONFIG_SYSTEM_TRUSTED_KEYS,改掉,保存。
sudo make -j8
sudo make modules_install
sudo make install