
是否有任何命令可以通过使用我可以清除 RHEL 中的缓存?
我使用了这个命令:
sync; echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
但它没有用。
我一直在尝试了解Zswap、Zram 和 Zcache用例的差异。提前为冗长/略带草率的问题道歉。我做了一堆谷歌搜索,我知道zram基本上是一个用于压缩交换的块设备,而zswap使用frontswap api在内核中压缩。看起来 zswap 的一个优点是它可以在压力下以 LRU 方式将一些页面移动到后备交换,而 zram 不能这样做(请确认,不确定这是否属实)。
所以这是我的问题:1.) 作为桌面用户,zcache/zswap/zram,尤其是 zswap 和 zram 之间的性能差异是什么?例如,在内存碎片(导致过度内存使用和浪费的那种)方面是否更好/更差?
额外问题:2.) 对于桌面性能(包括桌面的响应性,加上最小的破坏性交换行为和合理的内存管理),是否有上述(例如 zram+zswap 或 zram+zcache)的理想组合?
*非常感谢引用来源。
我应该补充一点,我是一名经验丰富的 Linux 用户(5 年),并试图真正了解我的系统(包括内核)是如何工作的。但是,我不是程序员,只有非常基本的编程知识(3 学分的大学课程)。但如果需要,请保持技术水平;我会在我自己的时间解析你的意思。
系统规格:
Linux Mint 15
Processor:Core 2 Quad 6600 (2.4ghz)
Ram: 8G
linux kernel: liquorix 3.11 series
Storage: 128 GB SSD, 1TB HDD 5400rpm
Run Code Online (Sandbox Code Playgroud)
请不要“购买更多内存”评论!我已经在这块主板上最大化了内存,并且在可预见的未来有 0 美元的升级预算。然而,我喜欢保持开放的内存密集型程序(多个浏览器是我的 ram 的主要消费者),所以我不介意在合理的性能下降限制内进行交换。
如上所述这里,使用重定向open()写入到一个文件中。在 shell 中创建了一个内部 (?) 文件描述符,然后在需要时使用。
内部描述符是在脚本的整个持续时间内还是在 shell 生命周期内创建的?它是否会在经过一段时间、多次操作等后销毁?
我的意思是特别是 shell 本身为其内置操作打开的文件的文件描述符。是否为每个操作创建了描述符并打开了文件?它们保存多久?例子:
#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more
Run Code Online (Sandbox Code Playgroud)
第一个描述符实例是否保留到第二个操作?
我在终端中使用的外壳怎么样?有时我会保持一个会话开放数天,甚至数周。它是否仍然保留我使用 shell 内置程序操作的所有文件的描述符?
执行(例如)以下命令以获取内存映射页面的列表:
pmap -x `pidof bash`
Run Code Online (Sandbox Code Playgroud)
我得到了这个输出:
为什么一些只读页面被标记为“脏”,即需要回写的写入?如果它们是只读的,则进程应该无法写入它们...(在提供的示例中,脏页始终为 4 kB,但我发现其他情况具有不同的值)
我还检查了 /proc/ pid /smaps 并且该页面被描述为“私人脏”。
在现代 64 位 x86 Linux 上,内核端如何设置虚拟页面和物理页面之间的映射?在用户端,您可以mmap从页面缓存中读取页面,这会将 4K 页面直接映射到用户空间 - 但我对页面在内核端的映射方式很感兴趣。
它是使用“整个 ram 身份映射”还是其他什么?整个 ram 身份映射通常使用 1GB 页面吗?
据我了解,在 Linux 上,进程加载器不会像堆栈那样自动为进程创建“堆”区域,这是正确的吗?
我使用过/proc/$$/maps,在调用之前malloc()没有“堆”区域。
交换分区不包含结构化文件系统。内核不需要它,因为它在标记为交换区的分区上存储了内存页。由于交换区中可能有多个内存页面,当进程请求将其页面加载到内存中时,内核如何定位每个页面。让我们解释更多,查看 Devuan OS 中交换分区的标题:
#define SWAP_UUID_LENGTH 16
#define SWAP_LABEL_LENGTH 16
struct swap_header_v1_2 {
char bootbits[1024]; /* Space for disklabel etc. */
unsigned int version;
unsigned int last_page;
unsigned int nr_badpages;
unsigned char uuid[SWAP_UUID_LENGTH];
char volume_name[SWAP_LABEL_LENGTH];
unsigned int padding[117];
unsigned int badpages[1];
};
Run Code Online (Sandbox Code Playgroud)
因此,当mkswap对分区执行命令时,这就是放置在该分区上的内容,即交换标头。
现在,让我们假设一个场景,进程 A 的内存页面被交换,因此交换区域中有一个内存页面。当然,交换区中可能有很多内存页。现在,进程 A 需要访问被交换的内存页。进程 A 告诉内核,我可以交换内存页吗?内核说:当然是我亲爱的朋友。内核会在交换分区中寻找进程 A 的内存页。由于交换分区不是一个复杂的结构(不是文件系统),内核如何知道如何在交换分区中定位进程 A 的特定内存页面。
也许内核在某处存储了那些交换页面的扇区地址,所以当一个进程请求它的内存页面时,内核知道在交换分区中查找的位置,从分区读取内存页面并将其加载到内存中。
如果 RAM 使用率高于 \xc2\xabswainess\xc2\xbb 中写入的级别,内核将使用 SWAP。好的。但是内核\xc2\xaborder\xc2\xbb是如何编程的呢?RAM 是 \xc2\xab 先来先服务 \xc2\xbb 吗?或者 SWAP 中最大的程序?RAM 中最常用的程序?
\n\n我想知道在 RAM 已满或几乎满的情况下,内核如何决定 RAM 或 SWAP。
\n根据我的理解,当Linux将物理页帧交换进/出RAM时,它需要为映射到该物理页的所有虚拟页设置有效位。将虚拟页映射到物理页框似乎在教科书中解释得很好,但是内核如何从物理页框找到所有虚拟页呢?如果能在 Linux 源代码中实际实现,我们将不胜感激。
我找到了一些关于什么是“地址绑定”的解释。他们说“地址绑定是将虚拟或逻辑地址映射到物理地址的操作”。
这个定义正确吗?
我无法确定它是否正确,因为大学的演示文稿说将虚拟地址转换为物理地址是在执行时执行的。但是,地址绑定表示绑定操作可以在编译时、加载时或执行时实现。
这说明存在矛盾。
Linux中用户和内核虚拟内存的大小是根据什么决定的?(32 位,如果相关的话。)它可以配置吗?
如果我们有 512 MB RAM,用户和内核虚拟地址的大小是多少?