运行 基于物理内存的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
我是 运行 我在 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