我有一台 Raspberry Pi 3B,想要运行兰卡什在上面。我知道性能不会很好,因为 Raspberry Pi 只有快速以太网和移动 CPU。
Docker 镜像由三部分组成:Dnsmasq、Sniproxy 和 Nginx。前两个运行正常,但是 Nginx 出现错误退出:
[alert] 1#1: mmap(MAP_ANON|MAP_SHARED, 268435456) failed (12: Out of memory)
pi 使用 940MB 内存中的 ~100MB,所以应该不会有问题。还有足够的可用磁盘空间。
造成此错误的原因是什么?
答案1
当你查看data/conf/*.nginx.conf
该项目中的 nginx 配置()时,你会发现以下几行:
proxy_cache_path /cache/arenanet keys_zone=arenanet:256m levels=1:2:2 inactive=365d;
这将导致 nginx 分配 256 MiB(268435456 字节)的内存来管理此缓存。这就是失败的原因。
现在,有 13 条这样的语句,每个支持的服务一条。总共需要 3.25 GiB 的内存。这可能超过了 32 位地址空间所能提供的内存量,无论有没有交换。它根本无法工作。
您需要修改此配置,减少密钥缓存的大小(从而减少缓存对象的最大数量),或者使用 64 位操作系统(幸运的是,Pi 3 有一个 64 位 CPU)。但是,如果没有真正的 RAM 来支持这些缓存,速度就会非常慢。
答案2
我能想到的一件事就是尝试增加 Raspberry Pi 上的交换空间。
交换文件配置位于:
/etc/dphys-swapfile
您要更改的变量名为“CONF_SWAPSIZE”。它的默认值应为 100,请尝试将其增加到 2048 (2GB),看看是否能解决您的问题。
这是我为增加交换大小:
sudo sed -i -e 's/CONF_SWAPSIZE=.*/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
将交换大小重新设置为普通的:
sudo sed -i -e 's/CONF_SWAPSIZE=.*/CONF_SWAPSIZE=100/' /etc/dphys-swapfile
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
请注意,增加交换大小会磨损 SD 卡,因此从长远来看这可能不是最好的解决方案。