目录标题
- 🔍 一、性能问题排查步骤与命令
- ✅ 1. 查看资源使用情况(CPU、内存、IO)
- ✅ 2. 检查并发连接与线程状态
- ✅ 3. 慢 SQL 和等待事件分析
- ✅ 4. 查看锁和阻塞
- ✅ 5. Page Life Expectancy(判断内存压力)
- 🛡 二、高可用异常排查步骤与命令
- ✅ 1. 分析数据库是否崩溃或被 kill
- 📁 查看 SQL Server 错误日志(公有云可通过管理控制台下载)
- 📋 查看系统事件(需 OS 权限)
- ✅ 2. 检查平台健康探测/Failover 原因
- ✅ 3. 检查主备同步延迟(Always On 或镜像场景)
- ✅ 4. 模拟主备切换 + 业务恢复验证
- 🧩 附:压测推荐工具和方案建议
针对压测中遇到的 性能瓶颈 与 高可用异常切换 两大问题,分别给出 具体排查步骤、工具和命令,适用于 SQL Server 数据库(公有云场景,如阿里云、华为云、Azure 等)。
🔍 一、性能问题排查步骤与命令
✅ 1. 查看资源使用情况(CPU、内存、IO)
-- CPU 使用率(每个 session)
SELECT r.session_id, r.cpu_time, r.total_elapsed_time, s.login_name, s.status
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
ORDER BY r.cpu_time DESC;
-- 内存使用统计
SELECT * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
-- 当前磁盘IO延迟
SELECT database_id, file_id, io_stall_read_ms, num_of_reads,
io_stall_write_ms, num_of_writes
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
✅ 2. 检查并发连接与线程状态
-- 当前连接数
SELECT COUNT(*) AS [Connection Count] FROM sys.dm_exec_connections;
-- 活跃连接信息
SELECT session_id, login_name, status, host_name, program_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;
-- 工作线程情况
SELECT * FROM sys.dm_os_workers WHERE state != 'SUSPENDED';
-- 最大连接数配置
SELECT name, value_in_use FROM sys.configurations WHERE name = 'user connections';
✅ 3. 慢 SQL 和等待事件分析
-- 正在执行的 SQL 查询
SELECT r.session_id, r.status, r.command, t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t;
-- 等待事件分析(找出瓶颈类型)
SELECT TOP 10 wait_type, wait_time_ms, waiting_tasks_count
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK')
ORDER BY wait_time_ms DESC;
-- 查询最耗资源的 TOP SQL
SELECT TOP 10
qs.total_worker_time/1000 AS CPU_MS,
qs.execution_count,
qs.total_elapsed_time/1000 AS TOTAL_TIME_MS,
st.text AS QUERY_TEXT
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
ORDER BY qs.total_worker_time DESC;
✅ 4. 查看锁和阻塞
-- 当前锁等待
SELECT request_session_id, resource_type, resource_description, wait_type
FROM sys.dm_tran_locks l
JOIN sys.dm_os_waiting_tasks w ON l.lock_owner_address = w.resource_address;
-- 阻塞链分析
SELECT
blocking_session_id AS Blocker,
session_id AS Blocked,
wait_type, wait_time, wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id != 0;
✅ 5. Page Life Expectancy(判断内存压力)
-- Page Life Expectancy 越低代表内存压力越大
SELECT counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Page life expectancy';
🛡 二、高可用异常排查步骤与命令
✅ 1. 分析数据库是否崩溃或被 kill
📁 查看 SQL Server 错误日志(公有云可通过管理控制台下载)
EXEC xp_readerrorlog 0, 1, N'Error', NULL, NULL, NULL, N'desc';
📋 查看系统事件(需 OS 权限)
- Windows:
Event Viewer > System > SQL Server (MSSQLSERVER)
崩溃时间点; - Linux(Azure 或 AKS):
/var/opt/mssql/log/errorlog
。
✅ 2. 检查平台健康探测/Failover 原因
-
阿里云/华为云/腾讯云:查看实例控制台的事件记录 / 运维日志 / 主备切换记录;
-
日志关键词:
- “failover triggered”
- “probe timeout”
- “watchdog restart” / “heartbeat lost”
✅ 3. 检查主备同步延迟(Always On 或镜像场景)
-- 查询 AlwaysOn 副本同步状态
SELECT ag.name AS AG_Name, ar.replica_server_name, ars.role_desc,
ars.synchronization_state_desc, ars.connected_state_desc,
drs.log_send_queue_size, drs.redo_queue_size
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
JOIN sys.dm_hadr_database_replica_states drs ON ars.replica_id = drs.replica_id;
✅ 4. 模拟主备切换 + 业务恢复验证
-
人工触发 Failover(如控制台切主):
- 检查业务侧是否能自动连接主库;
- 检查是否存在连接堆积、应用阻塞;
- 用压测脚本验证切主后恢复时间(如是否超过 5 秒)。
🧩 附:压测推荐工具和方案建议
工具 | 用途 | 说明 |
---|---|---|
JMeter | 模拟 HTTP / JDBC 高并发 | 可模拟 8000 并发,控制连接池行为 |
sqlcmd | 命令行快速发起 SQL 压测 | 适合批量执行 SQL 的快速测试 |
Benchmark Factory / HammerDB | 数据库专用压测工具 | 提供事务模型,可模拟真实场景 |