我知道它的作用...我想我很好奇它为什么要解决我继承的应用程序中的问题。我接管了一个相当大的 tomcat 应用程序,它充当一堆 flex 客户端的 Red5 服务器,并处理大量实时交互数据,这些数据最终被刷新到 rails api。问题是随着时间的推移,这些客户端的响应在大量负载下增长到 3-400 毫秒,而通常小于 100 毫秒。客户怀疑这是我们真的无法确认的内存问题。有一天,我正在运行负载测试的临时服务器基本上停止接收请求或非常慢。一时兴起我发送了
sync && echo 3 > /proc/sys/vm/drop_caches
神奇的是,服务器恢复了活力并开始全速运行,为这些连接提供服务。这是巧合还是这种行为有意义?为什么?
Sam*_*tch 21
任何硬盘都比您的 RAM 慢几个数量级,因此 linux 使用您可能有的任何空闲 RAM 来缓存文件系统数据。但是,这真的永远不会导致性能问题,除非您的硬盘出现问题,或者您的服务器上的服务尝试以如此高的速率写入数据的时间太长,以至于服务器无法缓存或检索数据。这也可能表明您的硬盘已接近其使用寿命。
无论如何:
man sync
会告诉你同步做什么 [刷新 FS 缓冲区]command1 && command2
分解为“如果 command1 成功完成,则运行 command2”
command1 || command2
就是“如果 command1 失败,则运行 command2”您收到的命令充其量只是一个临时修复程序,并且表明您的系统存在其他问题。要么您的磁盘已达到使用寿命,要么您的系统动力不足,无法满足您的需求,或者两者兼而有之。
AWS 不适合胆小的人,您刚刚遇到了原因之一。AWS 上糟糕的磁盘 I/O 情况是众所周知的,这也是在其上构建应用程序的任何人要考虑的主要因素之一。您可以尝试改进磁盘优化实例和其他一些技巧(例如从 EBS 卷构建 RAID 0)。确保使用更大的实例(至少 m1.large)以确保内核可以缓冲磁盘 I/O。