漫游 Linux 内核内存管理:参数、分配与布局的深度探索

Linux内存管理-详解mmap原理

嘿,我在编写分布式系统时经常使用 mmap。
让我告诉你我的经历。

我记得第二年,我在上海做一个分析项目。
当时的数据量确实非常巨大,日志文件有几百GB,光是读取序列就极其缓慢。
直接使用读/写并在内核态和用户态之间来回切换成本太高。

然后我想到了使用mmap。
我将文件的一部分写入内存,程序直接在这块内存上工作,就像普通的内存访问一样。
嘿,效果真的很好。
文件访问速度明显加快,并且副本数量少得多。
如果打算读取数据,必须首先调用系统,然后内核将数据从世界读取到用户空间。
它可以直接从内存中检索。
更快吗?最关键的是共享内存。
当时我们有几个分析节点,需要同时处理相同质量的日志。
如果每个节点都复制文件,内存就会满。
然后我使用 mmap 将同一个文件映射到所有节点的内存中。
节点A写入其分析结果,节点B也可以直接看到。
这样内存共享就这么轻了,并且消除了数据同步的问题。
但mmap也不是万能的。
还有一次,当文件非常大时,我遇到了麻烦。
有一次在北京,我搭建了一个几百TB的视频文件处理系统。
使用 mmap 映射整个文件会导致系统崩溃和内存爆炸。
后来才知道,mmap指定的物理内存还是仅限于物理内存。
如果写入整个大文件,物理内存就不够了,当然系统就会不稳定。
因此,当mmap用于大文件时,必须将其分解为块,并且不能立即描述整个文件。

此外,mmap 文件访问直接指磁盘文件。
如果有一个写操作没有提交,系统突然断电,数据就会丢失。
与缓冲 I/O 不同,写入可以延迟。
因此,在使用mmap进行文件缓存时,必须特别注意数据的一致性问题。

总的来说,mmap是个好东西,用起来效率高,内存共享也方便。
但如果不注意限制条件,例如文件太大或物理内存不足,很容易出现问题。
反正这东西用起来方便,但是性格也知道,也不能乱用。

linux 下怎么查看一个进程占用内存大小

在终端输入 ps -p 进程ID -o rss 可以查看特定进程的内存使用情况。
根据2 02 1 年的数据,free-h是htop的替代品,但htop更常用。

不要使用top命令,实时性较差。