我们的 Linux 服务器响应速度非常慢。top
没有显示任何过多的 CPU 使用率。我注意到,尽管有大约 5GB 的可用内存,但系统正在使用所有交换区,没有剩余的可用交换区。这可能是系统运行缓慢的原因吗?除了减少进程数还有什么解决办法吗?
其次,即使有可用的空闲内存,为什么 Linux 已经进行了交换?我认为只有当没有实际内存剩余时才使用交换。
free -m
total used free shared buffers cached
Mem: 32045 26218 5826 0 127 123
-/+ buffers/cache: 25967 6077
Swap: 16387 16387 0
更新:
- 交换性处于默认级别:60
- 我不认为这是一个 numa 系统
- 我看到几个 java 进程在 8GB 堆上运行:
-Xms8000m -Xmx8000m
乍一看似乎很疯狂,但可能有人这样做是有原因的。我认为这就是消耗大部分交换空间的原因,但我需要进一步研究 java 堆如何影响 Linux 交换空间和内存/性能。任何有关上述 java 堆配置对系统性能影响的指示都会非常有帮助。
答案1
使用 8GB 堆初始化了多少个 Java 进程?也许将最大值保持在 8 并降低初始堆大小。如果您有磁盘空间,也可以尝试增加交换大小
答案2
你有tmpfs
坐骑吗?这些由交换备份,可能是可用交换空间为零的原因。做出syslog
或dmesg
表现出任何意想不到的事情?您确定您的系统不会经常交换吗?检查vmstat -SK 1
并验证列si
和so
(交换页面进出,以 KB/s 为单位)。如果您需要知道哪些进程正在交换,请运行sudo iotop -od5
。如果您运行的是 Ubuntu,则需要delayacct
内核标志才能获得完整的统计信息。对我来说,对于如此大的系统内存,您的系统似乎具有非常小的缓存和缓冲区。
交换用于提高整个系统的性能。例如,交换当前正在休眠的大型程序的部分,以允许将更多内存用于磁盘缓存或文件缓冲区。如果在这种情况下禁用交换,系统实际上将拥有更小的磁盘缓存和文件缓冲区。由于您的交换空间已满,因此您可能会遇到同样的问题。
如果您有任何“泄漏”内存的程序(即程序获取未真正使用的内存块),则交换空间尤其重要。这种“泄漏”可能不是程序中的错误,可能只是发生了内存很少使用的情况,因此最好将其视为泄漏。如果没有交换空间,此类泄漏的内存就无法用作高速缓存或缓冲区。
具有虚拟内存的正确运行的操作系统几乎总是使用交换,除非整个工作集(所有访问的文件、应用程序保留的所有内存和所有写入缓冲区)在系统的整个运行时完全适合内存。在大多数情况下,只有当系统不断重新启动或系统具有相对于整个文件系统大小而言大量的 RAM 时,才会出现这种情况。