Questions tagged «virtual-memory»

1
设置/ proc / sys / vm / drop_caches清除缓存
作为一些冷缓存时间的一部分,我试图释放OS缓存。该内核文档(检索2019日)说: drop_caches Writing to this will cause the kernel to drop clean caches, as well as reclaimable slab objects like dentries and inodes. Once dropped, their memory becomes free. To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free reclaimable slab objects (includes dentries and inodes): echo 2 > /proc/sys/vm/drop_caches To …

1
从/ proc / pid / smaps获取有关进程的内存使用情况的信息
对于中的给定过程/proc/<pid>/smaps,对于给定的映射条目,为: Shared_Clean Shared_Dirty 私人清洁 私人脏话 是Shared_Clean+ Shared_Dirty与其他进程共享的内存量吗?就像共享RSS? 同样,Private_Clean+ 仅可用于一个进程Private_Dirty的内存量吗?就像私人RSS? PSS值是否= PrivateRSS +(SharedRSS /共享它的进程数)? 阅读此链接后还有其他问题:LWN 现在,让我们讨论整个过程,我们正在查看其smap条目。 我注意到,如果我这样做Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirty,每smaps条目的过程中,我得到的报告过程中的RSS ps,这是很酷。例如 ps -p $$ -o pid,rss 能不能给我的RSS的(约)相同的值的每一个总和Shared_Clean,Shared_Dirty,Private_Clean,Private_Dirty在/ proc / $$ / smaps项。 但是整个过程的PSS呢?因此,从上面的示例中,如何获得$$的PSS?我可以为每个smap映射添加PSS条目,然后以$$的价格到达PSS吗? 那么在整个过程中USS呢?再次以上述示例为例,我猜想我可以通过对$$ ..的每个smaps条目仅汇总Private_ *条目来以$$到达USS。 注意: PSS =比例设置大小。 USS =唯一的集合大小。

2
为什么在`rm`坏后关闭计算机电源会保存我的文件?
经典情况:我遇到了麻烦rm,立即意识到我删除了错误的文件。(没有什么紧要关头,我可以容忍最近的备份,但仍然很烦人。) 如果想使用extundelete此类工具恢复文件,我知道进一步的磁盘活动是我的敌人,所以我立即物理关闭了计算机的电源(即使用电源按钮,而不是使用halt诸如此类的命令)。这是一台笔记本电脑,没有重要任务在运行,也没有打开任何东西,因此是可以接受的操作。(顺便说一句,从那以后我就知道,在这种情况下要做的第一件事就是首先估计丢失的文件是否仍然可以通过https://unix.stackexchange.com/a/101247进程打开-如果是,则应以这种方式恢复它们,而不是关闭机器电源。) 尽管如此,一旦机器断电,我想了一会儿并认为文件不值得花时间启动实时系统进行适当的取证。所以我重新启动了机器。然后我发现我的文件仍坐在磁盘上:在rm断电之前,这些文件还没有传播到磁盘上。我跳了一点舞,感谢系统管理员之神的意想不到的宽恕。 现在我的问题是了解这是怎么可能的,以及在将an rm实际传播到磁盘之前的典型延迟是多少?我知道磁盘IO不会立即刷新,但会在内存中放置一段时间,但是我认为磁盘日志会迅速确保挂起的操作不会完全丢失。https://unix.stackexchange.com/a/78766似乎暗示了一种单独的机制来刷新脏页和刷新日记帐操作,但没有提供足够的详细信息说明日记帐将如何涉及到rm以及预期的延迟时间操作被刷新。 更多详细信息:数据位于LUKS卷内的ext4分区中,并且在备份计算机时,我在中看到以下内容syslog: Sep 24 10:24:58 gamma kernel: [ 11.457007] EXT4-fs (dm-0): 1 orphan inode deleted Sep 24 10:24:58 gamma kernel: [ 11.458393] EXT4-fs (dm-0): recovery complete Sep 24 10:24:58 gamma kernel: [ 11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null) 但是我不相信它与rm。 另一个问题是是否有一种方法可以告诉内核不执行任何未决的磁盘操作(而是将其转储到某个地方),而不是关闭计算机电源。(当然,不执行挂起的操作听起来很危险,但是无论如何关闭机器电源,都会发生这种情况,并且在某些情况下可以节省您的时间。)这当然会“更清洁”,也很有趣例如,对于那些不易关闭物理电源的远程服务器。

2
这是Linux分页应该如何表现吗?
当我的Linux系统接近分页时(例如,在我的情况下,16GB的内存几乎已满,16GB的交换空间完全为空),如果新进程X尝试分配一些内存,系统将完全锁定。也就是说,直到不成比例的页面(已浪费X的内存分配请求的总大小和速率)为止。请注意,不仅gui变得完全没有响应,甚至sshd之类的基本服务也被完全阻止。 这是我用来以更“科学”的方式触发此行为的两段代码(当然是粗糙的)。第一个从命令行获取两个数字x,y,然后继续分配和初始化y字节的多个块,直到分配了x个以上的总字节。然后无限期地睡觉。这将使系统处于分页的边缘。 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main(int argc, char** argv) { long int max = -1; int mb = 0; long int size = 0; long int total = 0; char* buffer; if(argc > 1) { max = atol(argv[1]); size = atol(argv[2]); } printf("Max: %lu …

5
Linux是否不使用分段而是仅使用分页?
Linux编程接口显示了进程的虚拟地址空间的布局。图中的每个区域都是一个分段吗? 通过了解Linux内核, 下列意思是否正确,即MMU中的分段单元将分段和分段内的偏移量映射到虚拟内存地址,然后分页单元将虚拟内存地址映射到物理内存地址? 存储器管理单元(MMU)通过称为分段单元的硬件电路将逻辑地址转换为线性地址。随后,称为分页单元的第二个硬件电路将线性地址转换为物理地址(见图2-1)。 那么为什么说Linux不使用分段而是仅使用分页呢? 分割已包含在80x86微处理器中,以鼓励程序员将其应用程序拆分为逻辑上相关的实体,例如子例程或全局和本地数据区域。但是, Linux以非常有限的方式使用分段。实际上,分段和分页在某种程度上是多余的,因为它们都可以用于分隔进程的物理地址空间:分段可以为每个进程分配不同的线性地址空间,而分页可以将同一线性地址空间映射到不同的物理地址空间。Linux倾向于分页而不是分段,原因如下: •当所有进程使用相同的段寄存器值(即它们共享同一组线性地址)时,内存管理会更简单。 •Linux的设计目标之一是可移植到多种体系结构。特别是RISC体系结构,对分段的支持有限。 Linux 2.6版仅在80x86体系结构要求时才使用分段。


6
Linux可以“用完RAM”吗?
我在网上看到很多帖子,似乎是在抱怨托管的VPS意外终止进程,因为它们使用了太多的RAM。 这怎么可能?我以为所有现代OS都通过对物理RAM上的内容使用磁盘交换来提供“无限RAM”。它是否正确? 如果进程“由于RAM不足而被杀死”会发生什么情况?

3
进程的实际内存使用量
以下是服务器上mysql和apache上的内存使用情况。根据输出的pmap说,mysql正在使用大约379M,apache正在使用277M。 [root@server ~]# pmap 10436 | grep total total 379564K [root@server ~]# pmap 10515 | grep total total 277588K 将其与的输出进行比较top,我看到值几乎匹配。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10515 apache 20 0 271m 32m 3132 S 0.0 6.6 0:00.73 /usr/sbin/httpd 10436 mysql 20 0 370m 21m …

3
堆栈分配在Linux中如何工作?
操作系统是否为堆栈或其他内容保留了固定数量的有效虚拟空间?仅使用大局部变量就能产生堆栈溢出吗? 我写了一个小C程序来测试我的假设。它在X86-64 CentOS 6.5上运行。 #include <string.h> #include <stdio.h> int main() { int n = 10240 * 1024; char a[n]; memset(a, 'x', n); printf("%x\n%x\n", &a[0], &a[n-1]); getchar(); return 0; } 运行程序可以得到&a[0] = f0ceabe0和&a[n-1] = f16eabdf proc映射显示了堆栈: 7ffff0cea000-7ffff16ec000. (10248 * 1024B) 然后我试图增加 n = 11240 * 1024 运行程序可以得到&a[0] = b6b36690和&a[n-1] = b763068f …

3
100%分页到页面缓存中的文件被另一个进程修改后会发生什么
我知道修改页面缓存页面后,它会被标记为脏页面并需要回写,但是在以下情况下会发生什么: 方案: 文件/ apps / EXE是可执行文件,已完全分页到页面缓存中(所有页面都在缓存/内存中),并由进程P执行 然后,连续发行版将/ apps / EXE替换为全新的可执行文件。 假设1: 我假设进程P(以及其他任何具有引用旧可执行文件的文件描述符的人)将继续使用旧的/ apps / EXE内存,并且尝试执行该路径的任何新进程都将获得新的可执行文件。 假设2: 我假设,如果不是文件的所有页面都映射到内存中,那么在出现页面错误要求文件中的页面已被替换之前,一切都会好起来的,并且可能会发生段错误? 问题1: 如果用vmtouch等文件锁定文件的所有页面,这是否会完全改变方案? 问题2: 如果/ apps / EXE位于远程NFS上,那会有什么不同吗?(我认为不是) 请更正或验证我的2个假设,并回答我的2个问题。 我们假设这是一个带有某种3.10.0-957.el7内核的CentOS 7.6盒子 更新:进一步考虑,我想知道这种情况是否与其他脏页情况没有区别。 我猜写新二进制文件的过程将进行读取并获取所有缓存页面,因为它们都已被分页,然后所有这些页面都将被标记为脏。如果它们被锁住了,则在ref计数变为零后,它们将只是无用的页面而占用核心内存。 我怀疑当前执行的程序结束时,其他任何东西都将使用新的二进制文件。假设一切正确,我猜只有在仅部分文件进入页面时才有意思。


2
如何增加Mac OS X上的最大交换空间?
在Mac OS X Yosemite 10.10.5上,当我尝试运行需要分配和使用128 GB内存的计算(这是用C语言编写的命令行程序)时,内核会以极大的偏见杀死我的进程。此控制台日志条目是一个实例的示例: 15/9/25 7:08:40.000 PM内核[0]:低交换:杀死pid 6202(huffgrp) 分配并使用64 GB内存时,该计算可以在合理的时间内正常运行。我的Mac硬盘上有32 GB的RAM和beaucoup空间。我还在另一台具有8 GB RAM的Mac上进行了尝试,在该Mac上64 GB计算也可以正常运行,当然需要更长的时间,但是128 GB计算却以相同的方式被内核杀死。 顺便说一句,malloc()无论我要多少空间,都永远不会返回错误。一旦进程实际使用了过多的内存,内核将终止进程,从而导致大量交换到硬盘驱动器。 因此,似乎存在一个秘密的交换空间限制,介于64 GB和128 GB之间。 我的问题是:如何重新配置​​内核以允许更多交换空间?我找到了一个有前途的文件,/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist但看不到其中的秘密号码。的手册页dynamic_pager说,它所做的只是设置交换文件的名称和位置。该手册页中有较旧的版本,其中记录了-S用于设置所创建交换文件大小的选项。我尝试过,请求160 GB交换文件,但是没有效果。每个交换文件仍为1 GB,该进程仍被内核杀死。

1
pmap输出的含义
我main.c在Linux中写道: int main() { while (1){} } 当我编译并启动它时,我可以pmap: # pmap 28578 28578: ./a.out 0000000000400000 4K r-x-- /root/a.out 0000000000600000 4K r---- /root/a.out 0000000000601000 4K rw--- /root/a.out 00007f87c16c2000 1524K r-x-- /lib/libc-2.11.1.so 00007f87c183f000 2044K ----- /lib/libc-2.11.1.so 00007f87c1a3e000 16K r---- /lib/libc-2.11.1.so 00007f87c1a42000 4K rw--- /lib/libc-2.11.1.so 00007f87c1a43000 20K rw--- [ anon ] 00007f87c1a48000 128K r-x-- …

1
许多Gnome 3.28守护程序正在使用超过100 GB的VIRT。为什么?
我最近将此笔记本电脑更新为Fedora 28 Beta及其Gnome 3.28。事情大多都很好。 但是有些事情很奇怪。这不会引起问题,因为这都是虚拟内存。 但是,为什么这些守护程序分配100+ GB的虚拟内存? 0 1000 2012 1719 20 0 101649024 32904 SyS_po Sl ? 0:00 /usr/libexec/goa-daemon 0 1000 1983 1719 20 0 101704260 46416 SyS_po Sl ? 0:00 /usr/libexec/gnome-shell-calendar-server 0 1000 2210 1765 20 0 101736292 33656 SyS_po Sl+ tty2 0:00 /usr/libexec/deja-dup/deja-dup-monitor 0 1000 2452 1719 …

1
Zswap,Zram,Zcache桌面使用方案
我一直在尝试了解Zswap,Zram和Zcache 用例的差异。对于冗长/草率措词的问题,我们事先表示歉意。我已经做了很多谷歌搜索,而且我了解zram基本上是用于压缩交换的块设备,而zswap使用frontswap api在内核中进行压缩。zswap的一个优点似乎是,当处于LRU方式的压力下时,zswap可以将某些页面移至后备交换,而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 请没有“购买更多的ram”评论!我已经在此主板上达到了最大的内存,并且在可预见的将来有$ 0的升级预算。但是,我喜欢保留开放式内存密集型程序(多个浏览器是我的ram的主要使用者),因此我不介意在合理的性能下降范围内进行交换。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.