我不是 Solaris 专家,已经习惯了 Windows 操作系统。无论如何,我很难找出一直在发生的问题,但找不到答案。
我们有一台运行 Solaris 11 的物理服务器,它有 3 个运行 Solaris 10 的 LDOM。每个 LDOM 都有一个区域(除了全局区域之外,全局区域根本没有任何配置)。该区域是 Solaris 8(这是因为在其下运行的应用程序不支持高于 8 的 Solaris 版本)
现在我们的区域出现了问题,数据库位于一个磁盘中,而软件和其他东西位于不同的磁盘中。用户抱怨服务器速度很慢。
当我使用 top 和 iostat 检查状态时,事情看起来像这样
load averages: 1.82, 1.74, 2.71 09:45:06
1047 processes:1040 sleeping, 2 zombie, 2 stopped, 3 on cpu
CPU states: 85.0% idle, 11.5% user, 3.5% kernel, 0.0% iowait, 0.0% swap
Memory: 56G real, 12G free, 25G swap in use, 8798M swap free
负载的最高值为
5.xx 6.xx
CPU States: 40% idle,
Memory: 4G free
虽然 iostat 结果显示
root # iostat -xtc
extended device statistics tty cpu
device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id
vdc0 0.3 1.0 4.4 14.2 0.0 0.0 33.1 0 0 2 112 141 172 0 162
vdc1 40.9 3.6 667.9 78.7 0.0 0.2 3.4 0 8
vdc2 2.0 1.0 127.1 5.1 0.0 0.0 2.7 0 0
vdc3 0.0 3.8 0.0 90.9 0.0 0.0 3.8 0 1
vdc4 62.6 31.5 17615.7 1232.5 0.0 7.4 78.9 1 82
vdc5 12.5 7.9 281.2 421.3 0.0 0.1 7.2 0 4
vdc6 0.0 0.0 0.0 0.0 0.0 0.0 2.8 0 0
vdc7 0.0 7.3 0.0 451.0 0.0 0.0 2.1 0 1
vdc8 40.6 3.6 667.9 78.8 0.0 0.1 3.3 0 8
DB所在的磁盘4(vdc4)一直有很高的%b百分比,并且总是至少有1个进程在等待(%w),不确定它看起来是否糟糕,但考虑到超过150个用户访问一下,我觉得还可以。如我错了请纠正我
现在,每当用户 X 在 CMD 中列出或按 Enter 时,服务器都会花费很长时间才能显示新条目,登录时不会出现问题,他们实际上通过 ssh 快速登录。奇怪的是,root 用户在抱怨时却工作得很好。无论服务器资源低还是高,同样的问题总是会发生。
检查用户正在运行的程序,这是其唯一的进程。
# ps -fu user
UID PID PPID C STIME TTY TIME CMD
user 6027 6024 0 08:13:14 pts/15 0:00 -ksh
user 186 181 0 09:40:48 pts/4 0:00 -ksh
user 555 15455 0 09:42:52 ? 0:00 in.ftpd
user 14114 14104 0 08:42:06 pts/7 0:00 -ksh
user 24325 14114 0 09:15:28 pts/7 0:00 tail -f XXXXXXXX
user 26 15119 0 May 30 ? 0:35 ./oplinkse_SGCR6
user 8412 15119 0 01:59:24 ? 0:01 XXXXXXXXXXXXXXXXXXXX
user 27 26 0 May 30 ? 7:00 ./oplinkse_SGCR6
user 1504 6027 0 09:46:24 pts/15 0:00 tail -f XXXXXXXX
user 5818 5815 0 08:12:39 pts/14 0:00 -ksh
他们仅查看一些文件并通过 2 个 openlink 会话连接到数据库。即使他们没有运行任何东西,只是想要ls -l
一个包含 3 个文件的目录,也需要很长时间(有时甚至 1 分钟)
可以检查什么来找出问题所在?
我已经通过互联网进行了查找,但我发现的任何内容都是关于用户通过 SSH 的缓慢登录提示,而这不是这里发生的事情,因为他们立即收到登录提示,但在登录后当他们执行时一个命令它会在那里停留很长时间。
答案1
首先,您可以扩展一下:“用户抱怨服务器感觉速度很慢。”您的一些措辞暗示了网络延迟,而另一些则暗示了应用程序缓慢。
由于您使用的是 LDOM(现在是 Oracle VM for SPARC),因此您必须使用 SPARC 服务器。硬件 v11 和 LDOM 版本也很有用。您还需要为每个 LDOM 提供配置。也许是配置问题?
我还想知道是否可以通过在 v11 系统上仅使用 (1) Solaris 10 LDOM(我认为无法运行 v10)和 (3) Solaris 8 标记区域来获得更好的性能。与您当前的 (3) 个 ldom 配置(每个运行 (1) 个 Solaris 8 标记区域)进行比较。
答案2
这并不是真正的答案,但评论对此不起作用,它是一个可以帮助获得答案的故障排除工具。
此 DTrace 脚本将很好地指示系统内核将时间花在哪里:
#!/usr/sbin/dtrace -s
#pragma D option quiet
profile:::profile-1001hz
/ arg0 /
{
@hot[ arg0 ] = count();
}
dtrace:::END
{
printa( "%@u %a\n", @hot );
}
它捕获所有内核线程当前功能的许多样本,因此如果您的系统花费大量时间执行一小组任务,这个小脚本将很快揭示这一点。
要查看实际的内核堆栈,您可以使用
#!/usr/sbin/dtrace -s
#pragma D option quiet
profile:::profile-1001hz
/ arg0 /
{
@hot[ stack() ] = count();
}
dtrace:::END
{
printa( "%@u %a\n", @hot );
}
将其保存到一个文件,例如hot.d
,使用类似 的命令使该文件可执行chmod 755 hot.d
,然后以 root 身份运行它: ./hot.d
。它不会发出任何输出。让它运行一段时间,比如 30 秒左右。然后点击CTRL-C
停止。然后,它将按照观察到特定堆栈跟踪的次数的升序,发出运行时遇到的所有采样的内核当前函数或堆栈跟踪。
输出中的最后几个函数或堆栈跟踪可能会揭示您的系统大部分时间都在做什么。
例如,如果您的内核花费大部分时间执行某些操作,例如将碎片内存页面合并为 Oracle 数据库所需的大页面,您将立即看到它。
在 Solaris 11 虚拟机管理程序中运行它,然后在每个全局区域中运行。