数据库服务器CPU不能全部利用原因分析

背景

客户凌晨把HIS数据库迁移到配置更高的新服务器,上午业务高峰时应用非常缓慢。

现象

通过SQL专家云实时可视化界面看到大量的绿点,绿点表示会话在等待某项资源,绿点越大说明等待的会话数越多。

进入活动会话列表,发现大量会话的状态为runnable,runnable代表这个会话可以执行,但没有 CPU 可以分配给它,可以理解为正在等待 CPU 这项系统资源。

但是此时服务器的CPU利用率并不高,在30%左右。

从任务管理器里查看,服务器有128核心,但是绝大多数核心根本利用不上。

SQL专家云深度体检里有相应的诊断,SQL Server在线的CPU核数40小于检测到的CPU核数128,说明SQL Server只使用了40个核心。

没有SQL专家云,可以使用下面的语句查询。

--CPU总数SELECT  cpu_countFROM  sys.dm_os_sys_info
--在线CPU数SELECT  COUNT(*)FROM  sys.dm_os_schedulersWHERE  is_online = 1  AND status = 'VISIBLE ONLINE'

分析

从SQL Server 2012开始,企业版有两种许可证模式,基于核心和基于服务器+CAL。基于服务器+CAL许可证限制SQL Server最多能使用20个物理处理器,如果超线程已启用,这将是40个逻辑处理器。

确认数据库的版本为SQL server 2012 Enterprise Edition,也就是服务器+CAL许可证模式。

解决

在SQL Server安装文件中更换序列号,升级到基于核心的许可模式。

重启SQL Server服务后,在SQL专家云中确认已经是基于核心的许可证模式了,并且能用使用到128个核心。

其它情况

如下图,在为虚拟机分配CPU时,配置了16个插槽,每个插槽内核数为1,这样SQL Server标准版只能使用到4个CPU。应该合理的配置,例如2和8或者4和4。

### 查看数据库服务器利用率的方法 为了全面了解数据库服务器利用率,可以从多个角度出发,包括但不限于系统资源、存储空间、数据库活动以及查询性能等方面。以下是详细的说明: #### 1. ### 系统资源利用率 系统资源利用率反映了数据库服务器底层硬件的状态,主要包括 CPU 使用率、内存使用情况、磁盘 I/O 性能和网络流量等。 - **CPU 使用率**:通过监控工具(如 Prometheus 或 Grafana),可以实时观察到数据库服务器上的 CPU 负荷状况。如果发现 CPU 利用率达到较高水平,可能意味着存在某些高开销的操作或线程堆积的情况[^1]。 ```bash # Linux 下查看 CPU 使用率 vmstat 1 5 | awk '{if(NR>2) print $13+$14}' ``` - **内存使用情况**:对于大多数关系型数据库而言,充足的内存能够显著提升缓存命中率从而减少磁盘访问次数。因此监测剩余可用 RAM 数量至关重要[^2]。 ```bash free -m ``` - **磁盘 I/O 性能**:由于数据库操作通常涉及到大量的读写动作,所以密切关注磁盘子系统的健康度也是必不可少的一环[^1]。 ```bash iostat -dx 1 5 ``` #### 2. ### 存储空间利用率 除了关注操作系统级别的各项指标外,还需要特别留意数据库内部的数据文件及其对应的存储设备容量变化趋势。 - 对于 MySQL/MariaDB 用户来说,可以直接调用内置函数 `information_schema.INNODB_METRICS` 来获取 InnoDB 缓冲池等相关细节信息[^2]。 ```sql SELECT * FROM information_schema.INNODB_METRICS WHERE name LIKE 'buffer_pool%'; ``` - PostgreSQL 则提供了更为丰富的视图结构用于展示表空间分布详情[^3]。 ```sql SELECT pg_size_pretty(pg_database_size('your_db_name')) AS size; ``` #### 3. ### 数据库活动与负载 这部分侧重于分析实际发生的各类事务处理频率及延迟程度,进而判断是否存在过载风险。 - **活跃会话数**:过高数量的同时在线连接可能会拖累整体效能表现[^3]。 ```sql -- Oracle 示例 SELECT COUNT(*) FROM v$session WHERE status='ACTIVE'; ``` - **每秒查询数(QPS)**:这是衡量数据库繁忙程度的一个重要参考数值[^1]。 ```sql SHOW GLOBAL STATUS LIKE 'Queries'; -- MySQL 获取总查询次数后除以运行时间即可得出 QPS ``` #### 4. ### 查询性能表现 最后一步便是深入挖掘那些执行效率较低甚至引发阻塞现象的具体 SQL 文字串内容。 - **慢查询日志**:启用该功能有助于快速定位问题源头所在位置[^3]。 ```ini slow_query_log = ON long_query_time = 2 log_output = FILE ``` 综上所述,借助一系列专用命令行工具配合图形界面仪表板共同作用下,便能够较为精确地掌握目标主机当前的工作负担情形了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值