V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
icestraw
V2EX  ›  macOS

macOS 的内存压力为什么会出现 “百分比减少” 同时 “颜色变黄” 的情况?

  •  
  •   icestraw · 2023-03-25 16:02:57 +08:00 · 3368 次点击
    这是一个创建于 611 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如图所示 https://imgur.com/a/7eHF0Ws

    我不太清楚内存压力和颜色究竟有怎样的联系,分别代表什么。我之前一直认为,内存压力超过了某个百分比之后就会变色,但是既然有相反的情况出现,证明似乎并不是?
    17 条回复    2023-03-26 08:00:57 +08:00
    icestraw
        2
    icestraw  
    OP
       2023-03-25 16:20:31 +08:00
    @ohiu 我知道压力变黄表示内存不够用了,我只是不明白为什么在压力变小的情况下为什么颜色反而变黄,这似乎说明“百分比”和“颜色”不是同一种算法,我想了解背后算法的区别。
    ohiu
        3
    ohiu  
       2023-03-25 17:02:32 +08:00
    @icestraw 如果百分比就代表颜色的话,那要颜色做什么😂,没有人知道具体的算法,根据官网的描述,graph 只是让你看看是否短时间内有 spike ,表示有内存泄漏发生
    lscho
        4
    lscho  
       2023-03-25 17:27:46 +08:00 via iPhone
    百分比是指当前占用的内存,分为活跃内存(短期内使用的)和不活跃内存(长时间没有使用)。

    如果百分比很高表示占用内存高,就会去使用不活跃的内存空间(即把之前长时间没有使用的内存重新分配)

    如果不活跃空间也不多了,就是黄色或者红色
    lscho
        5
    lscho  
       2023-03-25 17:34:49 +08:00
    macOS 之前的版本是可以看到活跃内存和不活跃内存的占用情况,不清楚从哪个版本取消了,现在提供了更详细的显示,在活动监视器的顶部 菜单-显示-列 中可以筛选
    zhaoxin
        6
    zhaoxin  
       2023-03-25 17:59:40 +08:00
    @icestraw 很遗憾,具体算法苹果并没有公开,因此你无法知晓其中的区别。你只能通过自己的实验来尝试了解它。比如你可以看看你前后运行的应用是否有什么大的变化。目前唯一知道的就是这个算法是根据内核与内存相关的 1000 多个参数综合得出的。

    说说我的猜测。内存压力是否变黄和交换区的速度有关。可能你当时执行了磁盘操作,比如复制粘贴文件或者安装新软件等。导致交换区速度变慢,这个实时速度的降低,导致了颜色变黄。
    icestraw
        7
    icestraw  
    OP
       2023-03-25 18:03:24 +08:00
    @lscho 大概理解一下,应该是时间的区别?

    对于内存压力,大概是反应短期内存的使用情况,比如突然载入了特别大的图像,这会儿可能就会出现内存压力飙升的情况,但是此时显示估计还是绿色的,伴随着的是 swap 的疯狂使用。但是如果这张图片很长一段时间一直在被编辑,并没有释放的话,内存压力此时才会变颜色

    对于颜色的话,苹果大概是自己有一套算法,判定哪些是非活跃内存,因此如果这个算法判定系统很长一段时间都没什么非活跃内存可用(全都是活跃的)那就把内存压力标黄或者标红。这需要一定时间周期去判断。同时解除这个判断可能也需要一定时间,因为需要预判用户的使用情况。

    但是我怎么感觉,结合 macOS“尽可能使用多的空闲内存”的惯例,苹果把“内存够不够用”从直观数据变成了黑盒逻辑...
    icestraw
        8
    icestraw  
    OP
       2023-03-25 18:11:55 +08:00
    @zhaoxin 我的直观感觉是,如果一个时间段内,虽然我的内存占用是满的,但是我没有频繁操作电脑,这时候虽然开了很多浏览器 tab/窗口,swap 占用了很多 G ,但是此时压力不会上升太多。

    但是如果这时候突然执行了一个内存敏感且需要大量 IO 的操作,比如图片编辑 /代码编译,此时压力表就会突然变黄,哪怕总的内存没有上涨太多,也会陡然变卡。

    如果我执行上面内存敏感操作的时候,内存占用本身没有太多,这时候无论是压力还是颜色,都不会变化太多。

    感觉这么做同配置下性能可能有提升,但是有点剥夺了原来“内存占用百分比”的功能。毕竟我用 windows 的时候,如果内存太满,我就不会再往上加负载。而苹果通过 模糊内存占用 并且 强调内存压力 的做法,会让我对 是否可以在当前电脑上继续加负载 有错误的判断。
    zhaoxin
        9
    zhaoxin  
       2023-03-25 18:28:39 +08:00
    @icestraw 我倒是觉得苹果的这个设计更好一些。像你说的那样,如果压力只是一个百分比就能得出结论的东西,固然是容易理解。但是并不能真实反映系统的当前状态。苹果的这个相当于是实时的压力,需要综合考虑系统当前的状态。就如同我举例的那样,因为 SSD 的速度影响交换分区,所以 SSD 存在其他操作时,交换分区的速度就会下降,从而导致内存压力变黄,这个从量的角度上,其实是不变的。并没有内存需求的增加,但是因为交换分区变慢了,导致了内存整体性能的下降,从而变黄,这个不是更能真实反映系统的当前状态吗?

    另外,苹果有关与内存压力的说法,并不是不允许变黄,而是说如果长期变黄,那就需要增加内存。换句话说,这种实时的变化你不必过于关注,而应该关注的是长期的趋势,是否经常变黄,变黄后是否还能变回来。这个才是需要关注的。
    wyd011011daniel
        10
    wyd011011daniel  
       2023-03-25 20:31:40 +08:00
    可以看看 luvletter 的这期视频
    littlewing
        11
    littlewing  
       2023-03-25 21:31:37 +08:00
    是不是一个表示实时的占用,另一个表示 Load Averages
    icestraw
        12
    icestraw  
    OP
       2023-03-25 22:17:11 +08:00
    @wyd011011daniel 之前看过,他举出的那个例子同样极端,8G 的内存,10G+的 swap ,然后内存压力只有 50%不到,还是绿色的,我几乎就没遇到过这样的 ram 组合。我 32G 的设备,没吃到 10G 的 swap ,压力表都会有黄的时候。16G 的设备无论 swap 多少,哪怕是 0 ,只要使用强度上来了,一样内存压力变黄。只能说他使用强度并不大,可能平时的操作都是“大文件读写”,而不是“多任务频繁的 Context 切换”这种真正需要大内存的场景。瞬间大文件读写 /kernel bug 会吃 swap ,但是对内存不会频繁操作,在 macOS 中应该不会被判定为内存压力大。

    我对苹果的内存指示感觉太模糊,是因为我使用过程中,会觉得这个指标体验会有断层。一旦压力表变黄,系统响应就突然会慢上一个档次,而“究竟开多少程序,才会导致内存压力变大”·这个度量是模糊的,因为 macOS 并没有显示“每个程序给系统造成压力大小”的任务管理器。从我的使用体验来讲,我认为知乎那些人说的并没有错,但是那个博主,我觉得他对原理科普是很耐心,但是有点故意找话题的感觉。我相信他应该对自己平时内存够不够用,心里会有另一杆秤。
    lslqtz
        13
    lslqtz  
       2023-03-25 23:20:12 +08:00
    首先可以考虑可能这一部分有个分界点在, 到达一定界限加余量后才会进行转换, 不会在边界点频繁转换.
    其次这个内存压力可能考虑的维度比较多, 比如缓存内存释放的代价大小等等.
    lslqtz
        14
    lslqtz  
       2023-03-25 23:20:59 +08:00
    另外我比较好奇你在跑什么样的程序, 因为我机器的内存压力是在 70-80% 才黄的.
    icestraw
        15
    icestraw  
    OP
       2023-03-25 23:35:51 +08:00
    @lslqtz 和我跑的程序似乎关系没那么大,也就音乐,记事本,编辑器,IDE ,浏览器啥的,tab 也就 10 个左右。但是似乎和我切换的频率有关系,用着用着压力就大了。感觉就像苹果一开始觉得部分内存存在 swap 里是没问题的,用着用着发现原来这些内存都会被频繁切换,就把压力标黄了。一旦变黄(可能还没黄),整个系统就开始变卡。打开图片啊图纸就会变慢。

    因此我一般用 macOS 的时候并不习惯看内存压力,反而比较习惯看“已压缩”的内存。如果这个值开始增长,系统响应就会变慢。和我的理解也比较相符:系统资源有相当一部分被拿来压缩内存了。哪怕它是硬件加速的,因为压缩 /解压缩需要时间,写入速度肯定远不如内存本身,也会导致系统整体响应变慢。归根结底内存压缩只是对使用不频繁场景下的压力缓解方式,对真正需要及时响应,又需要那么多内存的场景 也无法超越物理限制。
    haroldji
        16
    haroldji  
       2023-03-26 07:55:50 +08:00
    有个自带命令行工具:memory_pressure ,里面有更详细的数据呈现;其中最后一行 System-wide memory free percentage 应该就是内存压力的量化,亲测小于 50% 才会变黄
    haroldji
        17
    haroldji  
       2023-03-26 08:00:57 +08:00
    @icestraw 它 10 GB 的 swap 只是表示过去一段时间曾经用到这个水平,随着内存释放自然会回到低占用和绿色压力,但系统显示 / 真实 swap 分区并没有清除,可能在低内存压力下也会无视 swap 触发阈值而保持硬盘写入,只有重启才能清除
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2808 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:10 · PVG 23:10 · LAX 07:10 · JFK 10:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.