我在 OS X 的日常使用中(以及根据互联网上的各种帖子显示的其他几种情况)中的一个常见现象,只要没有更多“可用”内存可用,系统似乎就会变慢。据称,这是由于交换造成的,因为明显的磁盘活动很重,并且 vm_stat 报告了许多页面输出。(纠正我的错误)
但是,当交换开始/发生/结束时,“非活动”内存的数量通常约为所有可用内存 (^1.) 的 12.5%-25%。
根据http://support.apple.com/kb/ht1342:
非活动内存
内存中的这些信息没有被积极使用,但最近被使用过。
例如,如果您一直在使用 Mail 然后退出它,Mail 使用的 RAM 将被标记为非活动内存。此非活动内存可供其他应用程序使用,就像空闲内存一样。但是,如果在其他应用程序使用其非活动内存之前打开 Mail,Mail 将打开得更快,因为它的非活动内存被转换为活动内存,而不是从较慢的硬盘加载邮件。
非活动列表包含当前驻留在物理内存中但最近未被访问的页面。这些页面包含有效数据,但可能随时从内存中释放。
所以,基本上:当一个程序退出时,它的内存被标记为 Inactive 并且应该可以随时声明。尽管如此,每当“可用”内存变低时,OS X 更愿意开始将内存换出到交换文件,而不是仅仅声明这块内存。
为什么?这种行为比立即释放非活动内存甚至不触及交换文件的优势是什么?一些消息来源 (^2.) 表明 OS X 会在释放“非活动”内存之前将其分页以进行交换,但是如果内存可能随时从内存中释放,现在这样做没有意义吗?交换很贵,释放很便宜,对吧?
可以使用某些偏好或已知的 hack 来改变这种行为吗?(最好是不包括完全禁用 swap/dynamic_pager 和重新启动...)
我很欣赏清除命令,以及修复磁盘权限以强制释放一些可用内存的概念,但这些是痛苦地强制更多可用内存而不是实际修复交换/释放决策逻辑的方法......
顺便说一句类似的问题在这里问:http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/这里:HTTP://hintsforums.macworld .com/showthread.php?t=87688但即使 OP 重新询问了核心问题,但没有任何回复给出了答案......
^1。2012 年 3 月 17 日更新自从我第一次发布这个问题以来,我已经从 4gb 到 8gb 的已安装内存,问题仍然存在。“非活动” ram 的数量以前是 0.5gb-1.0gb,现在在交换开始/发生/结束时通常约为 1.0-2.0GB,即似乎大约 12.5%-25% 的 ram 被 osx 保留为非活动状态内核逻辑。 …
我尝试将我的开发系统调整到最大的可靠性。我禁用了交换,因为对于 GUI 使用,它主要以这种方式使机器无响应,不再可用。然而,如果激进的应用程序吃掉了内存,一些机制似乎会以速度为代价充分利用它。没有硬盘交换操作,但系统同样也没有响应。所以我想让 OOM 杀手在系统对内存增益做出任何特殊努力之前启动。例如,如果可用物理内存少于 100 MB,是否可以配置 OOM 杀手来采取行动?
L1、L2 和 L3 缓存在计算机中的确切位置?
我知道,我们使用缓存通过从缓存而不是主内存中选择数据和指令来提高性能。
以下是我的问题
L2 缓存究竟位于何处?
L3 缓存究竟位于何处?在主板上?
我认为最新的 SMP 处理器使用 3 级缓存,所以我想了解缓存级层次结构及其架构。
这可能是一个愚蠢的问题,可能是误解的结果。我现在正在研究 CPU,尤其是内存。我只是在读 SRAM 比 DRAM 快多少但更贵。SRAM 非常昂贵:我购物了一点,发现了一个 16 MB 的电池供电的 SRAM 卡,价格约为 400 美元。
最近一位朋友提到他一直在 RAM 中运行 Puppy Linux,而且速度很快。不过,我注意到,Linux 的小内核甚至可以更小……小至 8 MB!这让我想到:我们可以在 SRAM 中运行 Linux 吗?这个问题甚至格式正确吗?
谷歌搜索这个问题被证明是无效的,但它提出了更多的问题。可以在 L3 缓存中运行 Linux 吗?英特尔酷睿 i7 可以有一个足以容纳 8MB 的 L3 高速缓存……但我是否犯了绝对错误?这与“嵌入式”Linux 有什么区别?
这就是问题所在:我们可以在 SRAM 或 L3 缓存中运行 Linux 吗?有什么更快的吗?我们的 Linux 能有多快!?
我想给我的计算机添加一些 RAM,因为这几天它变慢了,所以我来到任务栏查看内存使用统计,但我很难猜测一些内存管理参数的真正含义。所以
问题 1:Commited Memory、Cached、究竟是什么Paged,Not-Paged pool以及它们与In-UseMemory有何不同。
Q2 : 据我所知,内核有一个复杂的内存管理算法,所以如果我的笔记本电脑内存中有一些空闲内存,我是否可以得出我的物理内存足够的结论?
所以我正在和我的老板讨论内存管理。
有人告诉我,杀死进程不允许它释放内存。现在还是这样,还是几年前?
我们在这里谈论的是 Windows 和 OS X。
我编写了一个 .NET 4.5 应用程序,它缓冲来自 Kinect v2 的颜色、红外线和深度数据,对其进行一些处理,然后以未压缩的形式将其转储到磁盘;.NET 应用程序还将 ffmpeg 作为子进程启动,并将颜色数据通过管道传输到它以编码为 H.264。
因为我没有使用 SSD,所以视频数据到达的速度比我写入磁盘的速度要快。但是没关系,当我的 RAM 不足时丢弃视频帧对我来说是可以接受的。我唯一的要求是我保留的大部分内容都是连续的 8 到 10 秒的视频块。因此,当我没有足够的 RAM 来缓冲连续 8 到 10 秒的视频(大约 1.5 到 2 GB)时,我在我的 .NET 4.5 应用程序中添加了一些逻辑来开始丢弃视频帧。
而且,为了防止页面抖动,我已经完全禁用了分页文件。这给我留下了总共 16 GB 的物理 RAM。
我的问题是,即使有了这种机制,有时我的 .NET 应用程序或 ffmpeg 子进程仍然会在 Windows 8.1 因内存不足而惊慌失措时被杀死,因为显然我的应用程序在有大量视频数据积压时使用了最多的内存写入磁盘。有没有办法告诉 Windows 我的进程比其他进程更重要,以便 Windows 首先开始杀死其他不太重要的进程?
我正在运行 Debian 风格的 Linux,我使用 htop 来跟踪内存使用情况,因为它比 top 更详细。我似乎无法让它按内存排序并同时显示进程树。有没有办法用 htop 或替代方法来做到这一点?
到目前为止,我测试过的所有 GNU/Linux 发行版都存在这样一个问题:每当内存被填满并且系统开始交换时,整个桌面和图形用户界面都会变得无响应,有时我必须等待大约 5-10 秒移动物理鼠标直到鼠标指针实际移动。
这是一种令人讨厌的行为,尤其是在内存较低的系统上。
有什么方法可以让某些应用程序/作业(例如桌面环境等)比其他应用程序更优先保留在 ram 中,以便实际占用所有内存的应用程序在桌面环境等之前被交换?
编辑: 我说的是使用整个 RAM 的情况,因此如果未禁用它,它将始终开始交换(我不希望进程被随机终止)。我不仅在低内存环境中遇到了这个问题,而且在我的台式机上有 8GiB 内存时也遇到了这个问题,部分原因是许多虚拟机,部分原因是内存泄漏。ZRAM 也不是解决方案,因为它只会延迟问题。对于这个问题,我能想到的唯一解决方案是一些用户空间实用程序或内核 API,它们允许完全防止某些作业被交换,或者至少使其不太可能发生。有没有人知道其他解决方案,或者对现有或计划中的此类工具或 API 有所了解?
第二编辑: ulatencyd似乎并没有与systemd的较新版本的工作呢,根据https://aur.archlinux.org/packages/ulatencyd-git/和https://wiki.archlinux.org/index.php/Ulatencyd . 如果我理解正确的话,这可能是因为 systemd 从用户空间的角度接管了对 cgroup 的完全控制。
我问这个问题是因为我遇到了内存问题(BSOD、MemTest 错误),在我将故障棒从 SLOT3 切换到 SLOT4(如我的主板上所标记)后,这些问题似乎已经停止。
Windows 是否倾向于根据主板如何决定映射内存,先使用 SLOT1,然后使用 SLOT2、SLOT3、SLOT4 等?例如,如果我有 4 个 2GB 的记忆棒,并且我在特定时刻使用的 RAM 不超过 2GB(比如我只是盯着我的桌面或听音乐),其他 3 个记忆棒是否保留Windows 仅使用第一根棒 (SLOT1) 时处于非活动状态?