蚊章汇 - 内存
type: channel
link: https://linuxcn.bwsl.wang/tag/%E5%86%85%E5%AD%98/
items: 这儿几个字节，那里几个字节，我们说的是真正的内存
items: 硬核观察 #1160 内存 RowHammer 保护措施被新的方法击破
items: 硬核观察 #884 PyTorch 和 Triton 正在打破英伟达 CUDA 的垄断
items: 硬核观察 #457 新的“行锤”攻击打破了 DDR4 内存保护
items: 用 smem 命令获取内存使用统计信息
items: 实例讲解代码之内存安全与效率
items: 硬核观察 #295 推动苹果公司成为万亿公司的一封邮件
items: 使用开源工具进行 Linux 内存取证
items: 英特尔 Optane：用于数据中心内存缓存
items: 检查 Linux 中内存使用情况的 8 条命令

这儿几个字节，那里几个字节，我们说的是真正的内存
type: item
date: 2023-11-15T23:48:58+08:00
description: 今天的帖子来自于最近的 Go 语言的一次小测试，观察下面的测试基础片段 [1] ：func BenchmarkSortStrings(b *testing.B) { s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"} b.ReportAllocs() for i := 0; i < b.N; i++ { sort.Strings(s) } } sort.Strings 是 sort.StringSlice(s) 的便捷包装器，sort.Strings 在原地对输入进行排序，因此不会分配内存（或至少 43% 回答此问题的 Twitter 用户是这么认为的）。然而，至少在 Go 的最近版本中，基准测试的每次迭代都会导致一次堆分配。为什么会是这种情况？正如所有 Go 程序员应该知道的那样，接口是以 双词结构 实现的。每个接口值包含一个字段，其中保存接口内容的类型，以及指向接口内容的指针。 [2] 在 Go 语言伪代码中，一个接口可能是这样的：type interface struct { // the ordinal number for the type of the value // assigned to the interface type uintptr // (usually) a pointer to the value assigned to // the interface data uintptr } interface.data 可以容纳一个机器字（在大多数情况下为 8 个字节），但一个 []string 却需要 24 个字节：一个字用于指向切片的底层数组；一个字用于存储切片的长度；另一个字用于存储底层数组的剩余容量。那么，Go 是如何将 24 个字节装入个 8 个字节的呢？通过编程中最古老的技巧，即间接引用。一个 []string，即 s，需要 24 个字节；但 *[]string —— 即指向字符串切片的指针，只需要 8 个字节。逃逸到堆为了让示例更加明确，以下是重新编写的基准测试，不使用 sort.Strings 辅助函数：func BenchmarkSortStrings(b *testing.B) { s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"} b.ReportAllocs() for i := 0; i < b.N; i++ { var ss sort.StringSlice = s var si sort.Interface = ss // allocation sort.Sort(si) } } 为了让接口正常运行，编译器将赋值重写为 var si sort.Interface = &ss，即 ss 的地址分配给接口值。 [3] 我们现在有这么一种情况：出现一个持有指向 ss 的指针的接口值。它指向哪里？还有 ss 存储在哪个内存位置？似乎 ss 被移动到了堆上，这也同时导致了基准测试报告中的分配：Total: 296.01MB 296.01MB (flat, cum) 99.66% 8 . . func BenchmarkSortStrings(b *testing.B) { 9 . . s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"} 10 . . b.ReportAllocs() 11 . . for i := 0; i < b.N; i++ { 12 . . var ss sort.StringSlice = s 13 296.01MB 296.01MB var si sort.Interface = ss // allocation 14 . . sort.Sort(si) 15 . . } 16 . . } 发生这种分配是因为编译器当前无法确认 ss 比 si 生存期更长。Go 编译器开发人员对此的普遍态度是，觉得 这个问题改进的余地，不过我们另找时间再议。事实上，ss 就是被分配到了堆上。因此，问题变成了：每次迭代会分配多少个字节？为什么不去询问 testing 包呢？% go test -bench=. sort_test.go goos: darwin goarch: amd64 cpu: Intel(R) Core(TM) i7-5650U CPU @ 2.20GHz BenchmarkSortStrings-4 12591951 91.36 ns/op 24 B/op 1 allocs/op PASS ok command-line-arg…

硬核观察 #1160 内存 RowHammer 保护措施被新的方法击破
type: item
date: 2023-10-21T04:26:28+08:00
description: 内存 RowHammer 保护措施被新的方法击破2015 年，研究人员发现了一种被称之为 RowHammer 的攻击方式，当一个用户级应用程序反复访问 DDR 内存芯片的特定区域，可以导致比特翻转。 比特翻转 Bitflips 是指储存在电子设备上的个别比特发生翻转的事件，比如从 0 变为 1 或反之。各个内存厂商在后续产品中纷纷加入了抵御 RowHammer 攻击的保护措施，主要方法是限制程序在给定时间内打开和关闭目标芯片区域的次数。现在，研究人员发明了被称之为 RowPress 的新方法，能在部署了最新的 RowHammer 保护措施的 DRAM 中诱发比特翻转。RowPress 不是反复“锤击”选定区域，而是让其保持更长的打开时间。将这一方法和 RowHammer 结合可进一步提高这种攻击的威力。研究人员表示，“这本身并不是一种攻击。它只是表明比特翻转是可能的，而且很多，这很容易成为攻击的基础”。消息来源：Ars Technica老王点评：如果类似的方法层出不穷，那或许是该考虑新的内存技术了。一种新的路灯技术可以避免光污染对天文望远镜的影响光污染对天文学的威胁与日俱增，现代望远镜高度敏感，能感受到距离 50 甚至 200 公里的城市室外照明的影响。一项研究发现，星星正在以平均每年 10% 的速度从天空中“消失”。一项名为 “DarkSkyProtector” 的技术可以“让望远镜看到几乎是一片黑暗的天空”。该方案依赖于三个组件：一个能让 LED 灯以人眼无法察觉的极高频率闪烁的简单装置、一个全球定位系统接收器，以及望远镜摄像头上一个能与 LED 灯同步闪烁的特殊设计的快门。全球定位系统技术引导望远镜的快门只在 LED 灯熄灭的瞬间打开。该技术可以将天文图像中不必要的天空辉光减少 94%。消息来源：Space老王点评：技术的进步可以解决技术带来的副作用。另外，是不是可以顺便把马斯克的星链轨迹也一起消除了。Debian 继续支持 /usr 合并Debian 12 的目标是采用与其他 Linux 发行版类似的合并 /usr 文件系统布局，即 /{bin,sbin,lib}/ 目录成为 /usr/{bin,sbin,lib}/ 的符号链接。但 Debian 技术委员会在今年早些时候决定暂停合并 /usr 文件。不过，随着 Debian 12 正式发布几个月后，这一暂停决定被废止了。Debian 的合并 /usr 动作有望在两年后的 Debian 13 发布时全部完成。消息来源：Phoronix老王点评：这就是历史遗留问题，依我看，其实大可不必这么小心翼翼。

硬核观察 #884 PyTorch 和 Triton 正在打破英伟达 CUDA 的垄断
type: item
date: 2023-01-18T03:01:21+08:00
description: PyTorch 和 Triton 正在打破英伟达 CUDA 的垄断大部分机器学习软件开发框架严重依赖于英伟达 CUDA，并在英伟达 GPU 上表现最佳。但随着 PyTorch 2.0 和 OpenAI Triton 的到来，英伟达 CUDA 对机器学习的垄断地位正逐渐瓦解。即将到来的 PyTorch 2.0 在英伟达 A100 上的训练性能提升了 86%，在 CPU 上的推理性能提升了 26%。而且这种优势可以扩展到 AMD、英特尔、特斯拉、谷歌、亚马逊、微软等等各个公司生产的 GPU 和 AI 加速器上。而 Triton 能让高级语言达到与使用低级语言相当的性能，提高了可用性。消息来源：Semi Analysis老王点评：又一次证明了开源胜过闭源，无论闭源的护城河有多深。Basecamp 因巨额账单退出云计算Basecamp 的 CTO，也是 Ruby On Rails 的创建者 DHH 介绍了让该公司退出云计算的巨额账单。其 2022 年的费用为 320 万美元，绝大部分都花在了 AWS 上，其中 S3 花费 90 万美元，RDS 47 万美元，OpenSearch 52 万美元，Elasticache 12 万美元。即便如此，也是经过大量工作才减少到这一费用的，该团队不但运行了成本检查计划，还就作为私人协议就长期使用达成了协议。DHH 还用戴尔服务器的三年均摊成本做了对比。消息来源：The Register老王点评：云计算确实有很多好处，但也可能是个让你花钱上瘾的无底洞。使用了 25 年的笔记本内存规范 SO-DIMM 将被替换制定内存标准的组织 JEDEC 正在制定新规范，以取代已经使用了 25 年的 SO-DIMM 规范。新的 CAMM 标准将基于戴尔公司的设计，目标是在 2023 年下半年完成 1.0 规范，到明年推出基于 CAMM 的系统。现有的 SO-DIMM 在 DDR5/6400 时已经遇到了“困境”，CAMM 的主要吸引力在于它可以实现更高的内存密度，同时还可以扩展到更高的时钟速度。消息来源：PC World老王点评：这是不是代表以后笔记本会需要更多内存？

硬核观察 #457 新的“行锤”攻击打破了 DDR4 内存保护
type: item
date: 2021-11-17T02:52:57+08:00
description: 新的“行锤”攻击打破了 DDR4 内存保护“ 行锤 Rowhammer ”攻击是通过每秒数百万次访问（或者说锤打）脆弱芯片内的物理行，导致相邻行的比特翻转，这意味着 1 变成 0，0 变成了 1。一个没有特权的应用程序可以通过每秒数百万次以特定模式访问 DDR 内存的“行锤”来破坏内存中的数据，从而 获得系统特权。这个漏洞已经在 2015 年被发现，对 DDR3 造成了严重影响后，在 DDR4 中有所缓解。以前的“行锤”攻击都是以统一的模式锤击行，这些“攻击者”行被访问的次数相同。而 新发表的研究 中使用了非均匀模式，以不同的频率访问两个或更多的攻击者行。结果是：在一个测试池中，所有 40 个随机选择的 DIMM 都经历了比特翻转。老王点评：如果这个攻击技术被武器化，那所有使用 DDR 内存的计算机都处于被攻击的阴影笼罩之下。英特尔 4004 微处理器推出 50 周年1971 年 11 月 15 日 英特尔推出的 4004 微处理器仅使用了 2,300 个晶体管，一次可在芯片中运行四位数据。这种半英寸长的矩形集成电路的时钟速度为 750 kHz，每秒可进行约 92,000 次运算。英特尔于 1972 年推出有 3,500 个晶体管的八位的 8008；1978 年推出有 29,000 个晶体管的十六位的 8086，每秒可进行 710,000 次运算。IBM 将下一代的英特尔 8088 用于其首款 PC。而如今，苹果新的 M1 Max 处理器有 570 亿个晶体管，每秒可执行 10.4 万亿次浮点运算。这意味着计算机能力在 50 年内至少提高了 10 亿倍。老王点评：50 年对于人类历史来说是短短一瞬间，但是这小小的芯片却整个改变了世界。因文字太难输入，Facebook Messenger 五成语音流量来自柬埔寨2018 年 Facebook 工程师注意到了一个令他们不解的现象：Messenger 近五成语音流量 来自柬埔寨。高棉语有 74 个字符，比大部分文字都多。高棉语在每个键位都有两个字符，需要在两个按键层反复切换。因此在柬埔寨人们大量使用语音，虽然后来高棉语输入法也得到了改善。当然，语音沟通的不便之处就是没法快速搜索，只能根据语音条长短大致记忆。老王点评：还好我们的中文输入法比较好，或者说拼音普及的好，要不中文输入更难。

用 smem 命令获取内存使用统计信息
type: item
date: 2021-10-25T18:18:51+08:00
description: smem 命令允许你快速查看你的网页应用的内存使用情况。在我的编程工作中，我经常需要了解网页应用的内存使用情况。在深入研究细节和浏览器剖析工具之前，一个粗略的估计通常就足够了。为了了解 Linux 或 macOS 上的内存使用情况，人们通常使用 top 或 htop。我很想看到一个单一的数字：一个进程占用了多少内存。但这些工具所显示的统计数据可能很难理解。对于网页浏览器来说，它甚至更加复杂，因为它们经常运行许多独立的进程。它们在 top 输出中显示为一个长长的列表，每一个都有自己的单独指标。smem 命令幸运的是有 smem，另一个用于查看内存使用统计的命令行工具。用你选择的包管理器安装它，例如：sudo apt install smem 要获得 Firefox 的总内存使用量，请执行：smem -c pss -P firefox -k -t | tail -n 1 这些开关做了什么？-c 开关指定要显示的列。我只对 pss 列感兴趣，它显示一个进程分配的内存。-P 开关过滤进程，只包括那些名字里有 firefox 的进程。-k 开关显示以 MB/GB 为单位的内存使用情况，而不是单纯的字节数。-t 开关显示总数。tail -n 1 过滤器只输出最后一行，也就是总数的地方。输出是非常简单的：$ smem -t -k -c pss -P firefox | tail -n 1 4.9G 开门见山！而且，经过又一天忙碌的工作，打开了 50 多个选项卡，Firefox 仍然只使用 5 GB。看看吧，Google Chrome。用一个脚本更容易为了方便起见，我创建一个名为 memory-use 的小脚本，它将进程名称作为参数。我把所有的脚本都放在 ~/bin 里，所以：echo 'smem -c pss -P "$1" -k -t | tail -n 1' > ~/bin/memory-use && chmod +x ~/bin/memory-use 现在我可以很容易地测量任何应用的内存使用：memory-use firefox memory-use chrome memory-use slack 还有更多！该工具不仅可以显示总的内存使用情况。它甚至可以生成图形输出。比如：smem --pie name -c pss 显示类似这样的内容：关于更多的细节，我建议查看 smem 手册页。你可以在 https://linoxide.com/memory-usage-reporting-smem/ 上找到另一个很棒的教程。希望你喜欢!本文最初发表在作者的博客上，并经许可转载。via: https://opensource.com/article/21/10/memory-stats-linux-smem作者：Tomasz Waraksa 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

实例讲解代码之内存安全与效率
type: item
date: 2021-10-03T18:12:45+08:00
description: 了解有关内存安全和效率的更多信息。C 是一种高级语言，同时具有“ 接近金属 close-to-the-metal ”（LCTT 译注：即“接近人类思维方式”的反义词）的特性，这使得它有时看起来更像是一种可移植的汇编语言，而不像 Java 或 Python 这样的兄弟语言。内存管理作为上述特性之一，涵盖了正在执行的程序对内存的安全和高效使用。本文通过 C 语言代码示例，以及现代 C 语言编译器生成的汇编语言代码段，详细介绍了内存安全性和效率。尽管代码示例是用 C 语言编写的，但安全高效的内存管理指南对于 C++ 是同样适用的。这两种语言在很多细节上有所不同（例如，C++ 具有 C 所缺乏的面向对象特性和泛型），但在内存管理方面面临的挑战是一样的。执行中程序的内存概述对于正在执行的程序（又名 进程 process ），内存被划分为三个区域： 栈 stack 、 堆 heap 和 静态区 static area 。下文会给出每个区域的概述，以及完整的代码示例。作为通用 CPU 寄存器的替补，栈 为代码块（例如函数或循环体）中的局部变量提供暂存器存储。传递给函数的参数在此上下文中也视作局部变量。看一下下面这个简短的示例：void some_func(int a, int b) { int n; ... } 通过 a 和 b 传递的参数以及局部变量 n 的存储会在栈中，除非编译器可以找到通用寄存器。编译器倾向于优先将通用寄存器用作暂存器，因为 CPU 对这些寄存器的访问速度很快（一个时钟周期）。然而，这些寄存器在台式机、笔记本电脑和手持机器的标准架构上很少（大约 16 个）。在只有汇编语言程序员才能看到的实施层面，栈被组织为具有 push（插入）和 pop（删除）操作的 LIFO（后进先出）列表。 top 指针可以作为偏移的基地址；这样，除了 top 之外的栈位置也变得可访问了。例如，表达式 top+16 指向堆栈的 top 指针上方 16 个字节的位置，表达式 top-16 指向 top 指针下方 16 个字节的位置。因此，可以通过 top 指针访问实现了暂存器存储的栈的位置。在标准的 ARM 或 Intel 架构中，栈从高内存地址增长到低内存地址；因此，减小某进程的 top 就是增大其栈规模。使用栈结构就意味着轻松高效地使用内存。编译器（而非程序员）会编写管理栈的代码，管理过程通过分配和释放所需的暂存器存储来实现；程序员声明函数参数和局部变量，将实现过程交给编译器。此外，完全相同的栈存储可以在连续的函数调用和代码块（如循环）中重复使用。精心设计的模块化代码会将栈存储作为暂存器的首选内存选项，同时优化编译器要尽可能使用通用寄存器而不是栈。堆 提供的存储是通过程序员代码显式分配的，堆分配的语法因语言而异。在 C 中，成功调用库函数 malloc（或其变体 calloc 等）会分配指定数量的字节（在 C++ 和 Java 等语言中，new 运算符具有相同的用途）。编程语言在如何释放堆分配的存储方面有着巨大的差异：在 Java、Go、Lisp 和 Python 等语言中，程序员不会显式释放动态分配的堆存储。例如，下面这个 Java 语句为一个字符串分配了堆存储，并将这个堆存储的地址存储在变量 greeting 中：String greeting = new String("Hello, world!"); Java 有一个垃圾回收器，它是一个运行时实用程序，如果进程无法再访问自己分配的堆存储，回收器可以使其自动释放。因此，Java 堆释放是通过垃圾收集器自动进行的。在上面的示例中，垃圾收集器将在变量 greeting 超出作用域后，释放字符串的堆存储。Rust 编译器会编写堆释放代码。这是 Rust 在不依赖垃圾回收器的情况下，使堆释放实现自动化的开创性努力，但这也会带来运行时复杂性和开销。向 Rust 的努力致敬！在 C（和 C++）中，堆释放是程序员的任务。程序员调用 malloc 分配堆存储，然后负责相应地调用库函数 free 来释放该存储空间（在 C++ 中，new 运算符分配堆存储，而 delete 和 delete[] 运算符释放此类存储）。下面是一个 C 语言代码示例：char* greeting = malloc(14); /* 14 heap bytes */ strcpy(greeting, "Hello, world!"); /* copy greeting into bytes */ puts(greeting); /* print greeting */ free(greeting); /* free malloced bytes */ C 语言避免了垃圾回收器的成本和复杂性，但也不过是让程序员承担了堆释放的任务。…

硬核观察 #295 推动苹果公司成为万亿公司的一封邮件
type: item
date: 2021-06-07T19:18:18+08:00
description: 推动苹果公司成为万亿公司的一封邮件2007 年，苹果的市值约为 1500 亿美元。今天，它已经超过了 2 万亿美元，主要是基于 iPhone 的成功，而 iPhone 的成功，至少部分是基于 App Store 的成功。而这一切，都始于乔布斯的一封邮件。最初，iPhone 在每台设备上只预装了 16 个应用。乔布斯告诉开发者，如果他们想为 iPhone 创造应用，他们可以制作在 Safari 浏览器中运行的网页应用。用户立即开始想办法越狱，以便在他们的设备上安装应用。所以，苹果只能通过某种官方 SDK 使开发应用程序成为可能。乔布斯给该公司软件工程高级副总裁 Bertrand Serlet 回答到：“当然，只要我们能在 2008 年 1 月 15 日的 Macworld 上把它全部推出来。”2008 年，我们见到了苹果的 SDK 和 App Store。无论主动还是被动，App Store 这种划时代的创举，真正开创了新的智能手机时代。Linux 内核将一直保留前 1MB 内存在一些特定的情况下，前 64kb 的内存会被 BIOS 破坏；在另外一些罕见情况下，前面的内存也会被 BIOS 或 EGA/VGA 帧缓冲区所破坏。因此，与其针对不同情况分别设置内存规避区域，不如将整个前 1MB 内存设置为保留。因此，在 5.13 中将永久保留前 1MB 内存而不使用。现在真是内存富余了，可以随便将 1MB 内存保留不用了。而就在 20 多年前，那时候还是按 KB 计算着使用内存的。Torvalds 继续反对在编译 Linux 内核时使用 -O3 优化标志由于 GCC 的较旧版本可能会在 -O3 编译器优化级别下产生坏的代码，而且有时没有性能上的好处，Linus Torvalds 仍然反对在编译 Linux 内核时使用这种优化标志。Torvalds 总结了他目前对 -O3 的看法：“它在历史上一直有可怕的错误。它已经变好了，但‘变好’并不是一个很高的标准。”WireGuard 项目从开始就一直用 -O3 优化级别构建，也并没有看到因此而产生不良代码的情况，但由于 Torvalds 的指导意见，该项目放弃了这个选项。除了 WireGuard 之外，LZ4 和 Zstd 是仍然在用 -O3 的内核模块。一方面很多厂商转向使用新版本的编译器非常缓慢，另外一方面一些没有那么严谨的代码也并不适合更高级别的优化。理想化的优化措施，在现实情况中往往不能采用。

使用开源工具进行 Linux 内存取证
type: item
date: 2021-05-26T19:20:06+08:00
description: 利用 Volatility 找出应用程序、网络连接、内核模块、文件等方面的情况。计算机的操作系统和应用使用主内存（RAM）来执行不同的任务。这种易失性内存包含大量关于运行应用、网络连接、内核模块、打开的文件以及几乎所有其他的内容信息，但这些信息每次计算机重启的时候都会被清除。 内存取证 Memory forensics 是一种从内存中找到和抽取这些有价值的信息的方式。Volatility 是一种使用插件来处理这类信息的开源工具。但是，存在一个问题：在你处理这些信息前，必须将物理内存转储到一个文件中，而 Volatility 没有这种能力。因此，这篇文章分为两部分：第一部分是处理获取物理内存并将其转储到一个文件中。第二部分使用 Volatility 从这个内存转储中读取并处理这些信息。我在本教程中使用了以下测试系统，不过它可以在任何 Linux 发行版上工作：$ cat /etc/redhat-release Red Hat Enterprise Linux release 8.3 (Ootpa) $ $ uname -r 4.18.0-240.el8.x86_64 $ 注意事项： 部分 1 涉及到编译和加载一个内核模块。不要担心：它并不像听起来那么困难。一些指南：按照以下的步骤。不要在生产系统或你的主要计算机上尝试任何这些步骤。始终使用测试的虚拟机（VM）来尝试，直到你熟悉使用这些工具并理解它们的工作原理为止。安装需要的包在开始之前安装必要的工具。如果你经常使用基于 Debian 的发行版，可以使用 apt-get 命令。这些包大多数提供了需要的内核信息和工具来编译代码：$ yum install kernel-headers kernel-devel gcc elfutils-libelf-devel make git libdwarf-tools python2-devel.x86_64-y 部分 1：使用 LiME 获取内存并将其转储到一个文件中在开始分析内存之前，你需要一个内存转储供你使用。在实际的取证活动中，这可能来自一个被破坏或者被入侵的系统。这些信息通常会被收集和存储来分析入侵是如何发生的及其影响。由于你可能没有可用的内存转储，你可以获取你的测试 VM 的内存转储，并使用它来执行内存取证。 Linux 内存提取器 Linux Memory Extractor （LiME）是一个在 Linux 系统上获取内存很常用的工具。使用以下命令获得 LiME：$ git clone https://github.com/504ensicsLabs/LiME.git $ $ cd LiME/src/ $ $ ls deflate.c disk.c hash.c lime.h main.c Makefile Makefile.sample tcp.c $ 构建 LiME 内核模块在 src 文件夹下运行 make 命令。这会创建一个以 .ko 为扩展名的内核模块。理想情况下，在 make 结束时，lime.ko 文件会使用格式 lime-<your-kernel-version>.ko 被重命名。$ make make -C /lib/modules/4.18.0-240.el8.x86_64/build M="/root/LiME/src" modules make[1]: Entering directory '/usr/src/kernels/4.18.0-240.el8.x86_64' << 删节 >> make[1]: Leaving directory '/usr/src/kernels/4.18.0-240.el8.x86_64' strip --strip-unneeded lime.ko mv lime.ko lime-4.18.0-240.el8.x86_64.ko $ $ $ ls -l lime-4.18.0-240.el8.x86_64.ko -rw-r--r--. 1 root root 25696 Apr 17 14:45 lime-4.18.0-240.el8.x86_64.ko $ $ file lime-4.18.0-240.el8.x86_64.ko lime-4.18.0-240.el8.x86_64.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=1d0b5cf932389000d960a7e6b57c428b8e46c9cf, not stripped $ 加载LiME 内核模块现在是时候加载内核模块来获取系统内存了。insmod 命令会帮助加载内核模块；模块一旦被加载，会在你的系统上读取主…

英特尔 Optane：用于数据中心内存缓存
type: item
date: 2021-02-12T19:17:46+08:00
description: 英特尔推出了包含 3D Xpoint 内存技术的 Optane 持久内存产品线。英特尔的这个解决方案介乎于 DRAM 和 NAND 中间，以此来提升性能。英特尔在 2019 年 4 月的大规模数据中心活动中正式推出 Optane 持久内存产品线。它已经问世了一段时间，但是目前的 Xeon 服务器处理器还不能充分利用它。而新的 Xeon8200 和 9200 系列可以充分利用 Optane 持久内存的优势。由于 Optane 是英特尔的产品（与美光合作开发），所以意味着 AMD 和 ARM 的服务器处理器不能够支持它。正如我之前所说的，OptaneDC 持久内存采用与美光合作研发的 3D Xpoint 内存技术。3D Xpoint 是一种比 SSD 更快的非易失性内存，速度几乎与 DRAM 相近，而且它具有 NAND 闪存的持久性。第一个 3D Xpoint 产品是被称为英特尔“尺子”的 SSD，因为它们被设计成细长的样子，很像尺子的形状。它们被设计这样是为了适合 1u 的服务器机架。在发布的公告中，英特尔推出了新的利用四芯或者 QLC 3D NAND 内存的英特尔 SSD D5-P4325 尺子 SSD，可以在 1U 的服务器机架上放 1PB 的存储。OptaneDC 持久内存的可用容量最初可以通过使用 128GB 的 DIMM 达到 512GB。英特尔数据中心集团执行副总裁及总经理 Navin Shenoy 说：“OptaneDC 持久内存可达到的容量是 DRAM 的 2 到 4 倍。”他说：“我们希望服务器系统的容量可以扩展到每个插槽 4.5TB 或者 8 个插槽 36TB，这是我们第一代 Xeon 可扩展芯片的 3 倍。”英特尔Optane内存的使用和速度Optane 有两种不同的运行模式：内存模式和应用直连模式。内存模式是将 DRAM 放在 Optane 内存之上，将 DRAM 作为 Optane 内存的缓存。应用直连模式是将 DRAM 和 OptaneDC 持久内存一起作为内存来最大化总容量。并不是每个工作负载都适合这种配置，所以应该在对延迟不敏感的应用程序中使用。正如英特尔推广的那样，Optane 的主要使用情景是内存模式。几年前，当 3D Xpoint 最初发布时，英特尔宣称 Optane 的速度是 NAND 的 1000 倍，耐用是 NAND 的 1000 倍，密度潜力是 DRAM 的 10 倍。这虽然有点夸张，但这些因素确实很令人着迷。在 256B 的连续 4 个缓存行中使用 Optane 内存可以达到 8.3GB/秒的读速度和 3.0GB/秒的写速度。与 SATA SSD 的 500MB/秒左右的读/写速度相比，可以看到性能有很大提升。请记住，Optane 充当内存，所以它会缓存被频繁访问的 SSD 中的内容。这是了解 OptaneDC 的关键。它能将非常大的数据集存储在离内存非常近的位置，因此具有很低延迟的 CPU 可以最小化访问较慢的存储子系统的访问延迟，无论存储是 SSD 还是 HDD。现在，它提供了一种可能性，即把多个 TB 的数据放在非常接近 CPU 的地方，以实现更快的访问。Optane 内存的一个挑战唯一真正的挑战是 Optane 插进内存所在的 DIMM 插槽。现在有些主板的每个 CPU 有多达 16 个 DIMM 插槽，但是这仍然是客户和设备制造商之间需要平衡的电路板空间：Optane 还是内存。有一些 Optane 驱动采用了 PCIe 接口进行连接，可以减轻主板上内存的拥挤。3D Xpoint 由于它写数据的方式，提供了比传统的 NAND 闪存更高的耐用性。英特尔承诺 Optane 提供 5 年保修期，而很多 SSD 只提供 3 年保修期。via: https://www.networkworld.com/article/3387117/intel-formally-launches-optane-for-data-center-memory-caching.html作者：Andy Patrizio 选题：lujun9972 译者：RiaXu 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

检查 Linux 中内存使用情况的 8 条命令
type: item
date: 2020-02-09T20:11:22+08:00
description: Linux 并不像 Windows，你经常不会有图形界面可供使用，特别是在服务器环境中。作为一名 Linux 管理员，知道如何获取当前可用的和已经使用的资源情况，比如内存、CPU、磁盘等，是相当重要的。如果某一应用在你的系统上占用了太多的资源，导致你的系统无法达到最优状态，那么你需要找到并修正它。如果你想找到消耗内存前十名的进程，你需要去阅读这篇文章：如何在 Linux 中找出内存消耗最大的进程。在 Linux 中，命令能做任何事，所以使用相关命令吧。在这篇教程中，我们将会给你展示 8 个有用的命令来即查看在 Linux 系统中内存的使用情况，包括 RAM 和交换分区。创建交换分区在 Linux 系统中是非常重要的，如果你想了解如何创建，可以去阅读这篇文章：在 Linux 系统上创建交换分区。下面的命令可以帮助你以不同的方式查看 Linux 内存使用情况。free 命令/proc/meminfo 文件vmstat 命令ps_mem 命令smem 命令top 命令htop 命令glances 命令1）如何使用 free 命令查看 Linux 内存使用情况free 命令 是被 Linux 管理员广泛使用的主要命令。但是它提供的信息比 /proc/meminfo 文件少。free 命令会分别展示物理内存和交换分区内存中已使用的和未使用的数量，以及内核使用的缓冲区和缓存。这些信息都是从 /proc/meminfo 文件中获取的。# free -m total used free shared buff/cache available Mem: 15867 9199 1702 3315 4965 3039 Swap: 17454 666 16788total：总的内存量used：被当前运行中的进程使用的内存量（used = total – free – buff/cache）free： 未被使用的内存量（free = total – used – buff/cache）shared： 在两个或多个进程之间共享的内存量buffers： 内存中保留用于内核记录进程队列请求的内存量cache： 在 RAM 中存储最近使用过的文件的页缓冲大小buff/cache： 缓冲区和缓存总的使用内存量available： 可用于启动新应用的可用内存量（不含交换分区）2) 如何使用 /proc/meminfo 文件查看 Linux 内存使用情况/proc/meminfo 文件是一个包含了多种内存使用的实时信息的虚拟文件。它展示内存状态单位使用的是 kB，其中大部分属性都难以理解。然而它也包含了内存使用情况的有用信息。# cat /proc/meminfo MemTotal: 16248572 kB MemFree: 1764576 kB MemAvailable: 3136604 kB Buffers: 234132 kB Cached: 4731288 kB SwapCached: 28516 kB Active: 9004412 kB Inactive: 3552416 kB Active(anon): 8094128 kB Inactive(anon): 2896064 kB Active(file): 910284 kB Inactive(file): 656352 kB Unevictable: 80 kB Mlocked: 80 kB SwapTotal: 17873388 kB SwapFree: 17191328 kB Dirty: 252 kB Writeback: 0 kB AnonPages: 7566736 kB Mapped: 3692368 kB Shmem: 3398784 kB Slab: 278976 kB SReclaimable: 125480 kB SUnreclaim: 153496 kB KernelStack: 23936 kB PageTables: 73880 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 25997672 kB Committed_AS: 24816804 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB Percpu: 3392 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 H…