全部,
目前,我们通过 VMWare 在服务器上运行 VM CentOS。我遇到了性能缓慢的问题。在最初创建服务器时,速度非常快,但随着时间的推移,速度变得难以忍受的缓慢。
我有点困惑,因为我们没有使用任何交换,而且我们的负载也不是很糟糕。
这是我的最佳输出:
top - 15:38:49 up 1:10, 13 users, load average: 6.94, 6.92, 6.31
Tasks: 165 total, 7 running, 158 sleeping, 0 stopped, 0 zombie
Cpu(s): 50.0%us, 50.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16189104k total, 14704772k used, 1484332k free, 61140k buffers
Swap: 4095992k total, 0k used, 4095992k free, 1201532k cached
CPU 占用最高的项目是
PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20 0 1969m 1.1g 10m S 2.5 7.4 3:39.35 java
我确信我忽略了一些愚蠢的事情,但此时 SU 到另一个用户需要 20 秒。
答案1
如果你安装了 strace(yum install strace),你能否找到一个运行缓慢的命令(你在帖子中提到了 su)并在 strace -cf 下运行它:
# strace -F -c su - gonzo -c exit
...
Process 3583 detached
Process 3562 resumed
Process 3563 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
95.10 0.291882 7484 39 18 waitpid
2.01 0.006160 474 13 execve
0.77 0.002359 24 98 munmap
0.75 0.002310 110 21 clone
0.32 0.000973 24 41 mprotect
0.19 0.000586 3 194 rt_sigaction
0.18 0.000556 3 211 read
0.16 0.000497 2 263 mmap2
0.15 0.000471 43 11 write
0.10 0.000301 2 184 2 open
0.05 0.000151 0 418 rt_sigprocmask
0.04 0.000119 7 17 getrlimit
0.04 0.000116 1 157 fstat64
0.03 0.000101 1 75 23 access
0.02 0.000065 0 270 5 close
0.02 0.000061 1 98 fcntl64
0.02 0.000052 2 23 22 connect
0.01 0.000034 1 67 17 stat64
0.01 0.000032 1 25 getuid32
0.01 0.000031 2 18 sigreturn
0.01 0.000030 1 37 brk
0.01 0.000029 7 4 setreuid32
0.00 0.000000 0 1 chdir
0.00 0.000000 0 4 time
0.00 0.000000 0 1 getpid
0.00 0.000000 0 3 alarm
0.00 0.000000 0 9 pipe
0.00 0.000000 0 7 ioctl
0.00 0.000000 0 1 umask
0.00 0.000000 0 28 dup2
0.00 0.000000 0 1 getppid
0.00 0.000000 0 1 getpgrp
0.00 0.000000 0 1 setsid
0.00 0.000000 0 1 setrlimit
0.00 0.000000 0 8 readlink
0.00 0.000000 0 1 getpriority
0.00 0.000000 0 1 setpriority
0.00 0.000000 0 2 uname
0.00 0.000000 0 2 _llseek
0.00 0.000000 0 6 poll
0.00 0.000000 0 1 getcwd
0.00 0.000000 0 16 getgid32
0.00 0.000000 0 16 geteuid32
0.00 0.000000 0 16 getegid32
0.00 0.000000 0 4 setregid32
0.00 0.000000 0 1 setgroups32
0.00 0.000000 0 1 setuid32
0.00 0.000000 0 1 setgid32
0.00 0.000000 0 6 getdents64
0.00 0.000000 0 11 gettid
0.00 0.000000 0 13 set_thread_area
0.00 0.000000 0 3 keyctl
0.00 0.000000 0 29 socket
0.00 0.000000 0 2 send
0.00 0.000000 0 6 sendto
0.00 0.000000 0 12 recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00 0.306916 2500 87 total
然后您将能够看到哪些系统调用耗费了时间,这可能会给我们提供导致系统缓慢的原因的线索。
strace -tT 也可能有用。
您还可以将 strace 附加到正在运行的进程(strace -p)并了解它们正在做什么。
问题:如果停止所有 Java 进程,平均负载会开始下降吗?
答案2
安装/更新 VMware 工具。在物理服务器的 BIOS 中启用虚拟化支持(如果您的 CPU 支持,您将有此选项)。您正在使用 VMware 的哪种虚拟化解决方案?检查客户机 (VM) 和主机 (VMware 服务器) 计算机的性能。请指定 top 是来自客户机还是来自主机。您在主机中有多少内存,从客户机分配了多少内存?您是否对虚拟机有过量内存?主机是否在进行交换?
答案3
您为客户机分配的 vCPU 数量比主机少,不是吗?我怀疑您的客户机有两个 vCPU。主机有多少个?
过度订阅 CPU 可能会导致这种行为。
此外,还有一个选项可以降低 CentOS 虚拟机客户机中的滴答率,这可能会有所帮助,尽管我不认为这是根本原因。请查看第 3 节中的第一个要点http://wiki.centos.org/Manuals/ReleaseNotes/CentOS5.1
答案4
尝试使用“iostat”和“vmstat”工具。它们会为您提供有关正在发生的事情的更多信息。也许“sar”也会对您有所帮助。(您需要安装“sysstat”包才能获取这些工具。)
请在此处打印这些程序的输出。这样我们就可以为您提供更多帮助。
另一件好事是按照“戴维”告诉你的做。