最近我遇到了一个问题,一个stream氓程序导致一些ec2实例耗尽内存并崩溃。 这可能不应该是一个问题,除了我正在使用t2.small实例,这是相当内存限制,并有人可以响应我们的监测警报之前,内存用完。
显然最好避免使用交换,如果可能的话,但如果我已经交换启用我的实例可能会保持在线,尽pipe性能下降。
鉴于硬盘空间通常很丰富,即使仅在特殊情况下才需要交换,似乎也是一个好主意。
默认情况下,OpsWorks只允许交换微型实例,而不是小型实例。 为什么他们会在交换中保守,如果我不需要它进行正常的操作,我可能不希望启用交换吗?
我认为关键是你需要知道你的进程需要什么内存。 如果你使用EC2,这意味着你已经select了一个实例大小来覆盖一些工作负载; 我经常看到,工作量只是一个过程/服务。 添加一堆交换很便宜,但您需要知道何时/为什么使用交换。 我经常在这里看到答案, “添加交换,以防止某些不活动的进程占用了一些内存”,这对于桌面而言是有意义的,但在EC2实例上,您应该知道进程的运行特性 – 尤其是当您“重新开发一个应用程序 – 知道它是如何通过在开发过程中禁用swap来运行的,然后在生产时添加swap并将swappiness提高到一个很高的值(90+)。
另一种看待它的方式是,在服务器环境中,特别是在云中,您可以根据工作负载量身定制实例,是否真的希望进程交换? 性能可以吗? 当你得到一个尺寸太小的2GB内存的机器,运行一个需要3GB的进程来舒适地连续地将页面交换到磁盘上时,你不会成为一个快乐的野营者。
你有没有耗尽物理内存,还是用完了支持存储? 如果是后者,交换将使系统继续正常运行,即使没有任何数据写入它!
“如果我不需要它进行正常的操作,那么我有没有一个原因可能导致交换?
是。 交换可用是操作系统有效使用物理RAM所必需的。
例如,假设进程创build一个256MB文件的专用可写映射。 如果没有交换,操作系统必须为这个映射保留256MB的物理RAM,即使这个RAM没有被需要,因为映射从不被修改,以防进程决定修改映射的每个字节。
本质上,如果不进行交换,每个干净的可写页面都没有文件的支持,这意味着一页物理内存不能保存修改后的数据,即使这些页面在整个生命周期中都是可丢弃的。
即使你不需要,你真的真的想交换可用。
YMMV,但对于交互式工作负载,我的经验是,如果你开始使用页面文件,整个系统的性能就会停下来,而且通常是由一些失控的进程造成的,所以我宁愿让程序崩溃(内存不足)而不是杀死所有其他程序的性能。 所以,我configuration了我的家庭共享家庭计算机没有页面文件和额外的RAM的负载。 我妻子对不良performance的投诉显着下降。 去年我join了SSD的时候,情况变得更好了。