运行 基于物理内存的GC

Run the GC based on physical memory

我是 运行 我在 AWS Lambda 上的代码,我有一些性能问题,具体取决于我分配给 Lambda 的内存。

同一个电话:

             128 MB | 256 MB
           +--------+-------+
Cold start |  3.5s  |   2s  |
-----------+--------+-------+
Nominal    | 0.14s  | 0.14s |

最大使用内存始终为 85-90 MB。

我的猜测是 GC 触发得太频繁了。

我试过 the RTS doc,看起来 -c <n> 可以提高阈值,但它需要我使用 -M <size> 但我不知道该放什么那里。

有没有办法根据物理内存或总内存来设置阈值?

我想一种方法是通过 shell 替换。然后你可以把你想要的任何计算放在那里。例如,在我的机器上,像这样计算一半的可用内存:

(echo scale=0; sed '/^MemTotal:/!d;s/[^0-9]//g;s.$./2.' /proc/meminfo) | bc

解释:从/proc/meminfo中提取MemTotal: ...行,删除不是数字的所有内容,并附加/2以除以2。初始scale=0告诉 bc 四舍五入到最接近的整数。

将其滚动到命令的参数列表中,然后如下所示:

myFancyHaskellProgram +RTS -M $( (echo scale=0; sed '/^MemTotal:/!d;s/[^0-9]//g;s.$./2.' /proc/meminfo) | bc )K