我有一个 .NET (Core 2.0) 服务,我将其从 Windows 移至 AWS 上的 Linux 实例。这些实例是微型的,具有 1Gb RAM。
我为 Linux 实例添加了 1Gb 的交换空间,并设置了 swappiness=100,但当物理内存已满时,服务器会冻结。进程本身会变慢,几乎停止,甚至在 bash 上按下 ENTER 键有时也需要 10 秒钟才能出现新行。
运行时top
,我发现可用内存通常为 10、20mb。该进程使用 800Mb 以上的 RAM,而交换总是几乎为空,最大使用量为 20mb。即使在那里放了一个小时,也没有交换更多。
我可以看到 AWS 上的磁盘和 CPU 信用额度几乎达到 100%,因此它不会限制资源使用。此外,这些实例大约有一百个,我多次替换它们,行为始终相同,因此看起来不像坏例子问题。
令我烦恼的是,这种情况在 Windows 上没有发生,并且 Linux 实例在基本系统上使用的内存减少了大约 200mb。
除了 swappiness 之外,还有什么设置需要调整,以使 Linux 移动更多内存来交换?
编辑:交换已通过 cloud-init 正确设置,并且可以在重启后正常进行:
设置:
fallocate -l 1024M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
sysctl vm.swappiness=100
free -m
启动后:
total used free shared buffers cached
Mem: 993 232 760 0 7 152
-/+ buffers/cache: 72 921
Swap: 1023 0 1023
答案1
我找到了真正的问题。该应用程序在docker中运行,并且AWS 有意阻止 ECS 容器内的交换使用由于某种原因。由于我们之前没有使用 ECS 来管理 docker,因此此阻止不会影响 Windows。
在与他们的支持人员交谈后,他们不支持容器内交换,并且不知道什么时候会支持。所以,我必须离开 ECS 并自己管理 docker。
答案2
好吧,您的错误可能实际上很小。较高的 swappiness 值会导致某些操作系统配置出现问题。尝试使用 15 这样的值。(请注意:强迫您的系统优先使用 swap 是一个糟糕的想法。您的系统需要使用实际 RAM 才能正常运行。[如果您不知道或颠倒了它,swappiness 是在使用 swap 之前可用 RAM 的百分比,因此 15 表示在 SWAP 分区之前必须使用 85% 的 RAM。])
另外,您是如何添加交换空间的?如果您只是更改了配置而没有创建新分区,或者在 /etc/fstab 文件中留下了错误,那么您将无法使用交换空间,并且系统会尝试写入不存在或无法写入的内容(或者会发生更有趣的事情),从而导致无法使用。我已经通过这些方法破坏了不止一个安装。