我有一台在 Windows 2003 上运行的 Sybase ASE 12.5.2 服务器,对于大多数选择查询来说,它的速度非常慢。该系统是 2 x 双核 Xeon、4GB 内存和 200GB Raid5(10k SAS 磁盘),用于在具有 128MB 缓存 + BBU 的 LSI megaraid 控制器上存储数据。
服务器上唯一值得注意的迹象是 perfmon 中的“磁盘读取队列长度”为 100。通常这表示磁盘存在问题,但看起来磁盘没有任何问题。
有什么想法可以让我找出问题所在吗?我还应该说,我对 Solaris 上的 Sybase 比 Windows 上的 Sybase 更熟悉。
以下是屏幕截图:
替代文本 http://img.skitch.com/20090722-t4sgfxd5fb2ck7bbsdjei38uu6.png
这是 40 分钟的 sp_sysmon 输出。
编辑:显然,sp_sysmon 输出对于 serverfault 问题文本区域来说太大了。以下是完整输出的链接:[http://pastie.org/private/t5xqd0vamhz7ynnjuo3cxq][2]
编辑:我将屏幕截图更改为能够更好地反映当前情况的屏幕截图。
答案1
查看 sysmon,您正在尝试执行 964.2 IOPS,
Total Requested Disk I/Os 964.2 2373.5 2314183
其中 99.2% 由此设备占用,其他所有设备都只占很小一部分。所有设备都位于同一个物理阵列 (D:) 上,但如果它们什么都不做,那就不是问题。
设备:
D:\DTCLASS\ads\ads_data01
ads_data01 每秒每个 xact 计数占总数的百分比
Reads
APF 459.9 1132.0 1103670 48.1 %
Non-APF 495.8 1220.3 1189821 51.8 %
Writes 0.8 2.0 1978 0.1 %
总输入/输出 956.4 2354.3 2295469 99.2%
950 IOPS 应该在 10 个磁盘阵列 5 的能力范围内,特别是因为这些都是读取操作。如果我们保守估计每个主轴 100IOPS,那么我们估计这个阵列有 1000 IOPS。编辑:但是,我似乎误读了您的原始帖子,假设有 10 个磁盘!请告诉我们这个阵列中有多少个磁盘。
Cache Search Summary Total Cache Hits 1283.3 3158.8 3079829 71.9 % Total Cache Misses 502.2 1236.3 1205348 28.1 %
您遇到了相当多的缓存未命中。这让我怀疑您是否为 ASE 分配了足够的内存。在装有 ASE 12.5 的 Windows 上,ASE 的内存限制为大约 2.6 GB(无论是在 64 位还是 32 位 Windows 上)。您能否让我们看看 sp_configure 'memory' 的输出。我对这一行特别感兴趣:
max memory 33792 2950000 1475000 1475000 memory pages(2k) dynamic
有可能您为 ASE 分配了足够的内存,但您尚未将其添加到数据缓存中。您也可以让我们看看 sp_cacheconfig 的输出。
从 sysmon 输出的开始你就可以看到,你的 CPU 大部分时间都在处理 IO:
引擎繁忙利用率 CPU 繁忙 I/O 繁忙空闲
引擎 0 2.4 % 79.9 % 17.7 %
引擎 1 2.0 % 75.2 % 22.8 %
您还只能为 ASE 分配 2 个引擎,如果这是一台专用服务器,则在双核双核上最多可以分配 4 个引擎。虽然您的许可可能不允许这样做,因为 ASE 是经过许可的每个核心。
答案2
在我看来,您的实际平均磁盘队列长度为 3.554。比例设置为以该值的 100 倍绘制图表。
当该数字大于 RAID 组中主轴的数量时,通常会出现问题。
我将首先使用 sysinternals 中的 procmon 来确定磁盘使用情况。然后,我将研究特定于数据库的工具来监控查询(抱歉 - 对 sybase 了解不多)
答案3
你可以尝试这个优化工具为了帮助追踪和解决问题,它有 14 天的试用期。