Linux内核开机保留大块内存的方法总结

1 . reserve_bootmem 实验未果,大神经验分享。
2 . alloc_bootmem 简单,但内核映射需技巧。
3 . mem=1 8 0M 参数设置,硬件适配最重要。
4 . 内核映射用 ioremap 或 mmap。
你自己掂量。

这段代码看起来像是百度知道(Baidu Zhidao)网站的JavaScript和HTML代码。
下面我简单分析一下:
1 . 语言和框架:这段代码主要是使用JavaScript编写的,使用了AMD(异步模块定义)的模块加载机制,并且依赖于jQuery库。

2 . 功能模块:
帮助和意见反馈:代码中包含帮助团队导航的弹出窗口(common-new:widget/help-team-navigation/popup.es.js)。

消息列表渲染:用于显示和渲染消息列表(common-new:widget/js/logic/msg-new/listrender.es.js)。

用户等级:涉及用户等级的阈值和数据分析(common-new:widget/js/logic/usergrade/threshold.es.js 和 common-new:widget/js/logic/usergrade/gradedata.es.js)。

搜索框:包含新的搜索框组件(common-new:widget/search-box-new/search-box-new.js)。

底部信息:显示网站的底部信息(common-new:widget/footer/footer.js)。

3 . 代码结构:
资源映射:使用require.resourceMap定义了模块之间的依赖关系。

异步加载:使用require.async异步加载模块,提高页面加载速度。

4 . 安全性:
HTTPS:代码中包含将HTTP链接转换为HTTPS的脚本,提高数据传输的安全性。

用户数据:通过设置cookie来存储用户数据,如shitong_key_id、shitong_data和shitong_sign。

5 . 兼容性:
浏览器检测:代码中包含浏览器检测逻辑,针对不同浏览器进行不同的处理。

6 . 其他:
统计和日志:使用log.send发送统计和日志信息。

IE提示:对于IE浏览器,可能包含提示用户升级浏览器的脚本。

以上是对这段代码的简单分析,具体功能和使用细节可能需要更深入的研究。

Linux内核内存管理-LRU算法

哎,你问我LRU啊?上周有个客户问我们系统内存抖得厉害,跑了一堆命令最后发现是缓存没调好...正好,这事儿我就跟你唠唠内核里的LRU。

---
我自己踩过的坑是2 01 9 年在深圳搞一个大数据项目,当时服务器装了6 4 G内存,但应用跑起来内存占用飚到9 0%以上,卡得像屎一样。
后来查内核日志,发现居然在疯狂换页,把频繁访问的配置文件都换到交换分区去了。
那会儿我才知道,Linux的LRU可不是那么好玩的。

内核LRU核心是分层管理,这点特别绕人。
不像咱们写用户态缓存直接甩个LinkedHashMap就完事了,Linux得考虑物理内存分区。
比如DMA区域、Normal区域,每个区域都有自己独立的LRU链表。
你想想,如果所有页面混着挤一个链表,那频繁访问磁盘的DMA页面岂不是要抢走系统内存的活儿?
活页和非活页是关键。
活页(active_list)放最近刚被CPU摸过的页面,非活页(inactive_list)放比较老的。
内核有个叫refault的机制,就是有时候你把一个页换出到交换分区了,下次程序又访问它,系统发现"哟,这页我最近还用过呢",就会优先从inactive_list里找,而不是完全随机淘汰。

代码层面更复杂。
你给的Java例子挺好,但内核用的是C语言,而且还得加锁。
我记得在某个内核文档里看到过,LRU链表操作是会阻塞CPU的,因为你要是动链表的时候CPU还在访问那个页,数据就乱了。
所以内核用的是RCU(Read-Copy-Update)机制,读多写少的时候直接读,写的时候先复制一份再改,避免卡顿。

优化方面最有意思的是多级反馈队列(splitLRU)。
大概2 01 2 年左右Linux社区就发现,匿名内存和文件缓存放一个LRU链表效果不好,匿名内存缺页了老是换出文件页,文件页又可能马上被访问到。
后来就分成两个队列,匿名页的队列和文件页的队列,这样管理效率高多了。

但说到底,调LRU还是得看具体情况。
我们之前有个客户用OpenStack,他发现默认的LRU参数搞得交换太频繁,后来改了vm.swappiness值,把交换倾向调低,系统立马就不抖了。
但另一家搞HPC的,他们数据访问模式特别怪,根本不适合LRU,最后改用RCU+写时复制(Copy-on-Write)方案,效果反而好。

---
反正你看着办吧。
内核LRU是个挺深的东西,文档看得越多越发现坑。
你要是搞分布式缓存,用Redis那种近似LRU就行,省得自己实现。
你要是调系统内核参数,建议先抓个/proc/meminfo和/proc/[pid]/task看下内存分布,再慢慢改参数,别一上来就乱改。