一、接口请求响应指标
重点关注以下几个指标:
- 需满足的并发数
- TPS(每秒处理事务的能力)
- 响应时间(平均响应时间、90%响应时间)
- 错误率
性能测试指标通过标准 |
|
需满足的并发数 |
C = nL/T |
需满足的TPS |
据二八原则: |
响应时间 |
根据在并发情况下的响应时间2/5/10原则,最长不能超过10s |
错误率 |
具体系统具体要求,一般小于万分之一 |
缓存命中率 |
具体系统具体要求,一般大于85%通过 |
CPU占用率 |
70% 好,85% 坏,90%+ 很差 |
内存使用率 |
一般小于80%通过 |
二、服务器性能指标
重点关注以下几个指标:
- 线程对cpu占用(关注)
- 对内存占用(关注)
- 磁盘I/O
- 网络情况
性能项 |
资源 |
评价 |
CPU占用率 |
70% |
好 |
85% |
坏 |
|
90%+ |
很差 |
|
磁盘I/0 |
<30% |
好 |
<40% |
坏 |
|
<50%+ |
很差 |
|
网络 |
<30%带宽 |
好 |
运行队列 |
<2*CPU数量 |
好 |
内存 |
没有页交换 |
好 |
每个CPU每秒10个页交换 |
坏 |
|
更多的页交换 |
很差 |
使用命令查看CPU、内存变化情况:
top -b -d 1 -p 27854 > 0904log
p是进程号 ,d是1秒收集一次,要用root用户(sudo su -)
查看进程号 ps ef |grep acs-job 若重启服务器后,pid会发生变化,必须重新获取
三、SQLServer数据库查询慢语句(需数据库管理员权限)
--总耗CPU最多的前20个SQL:
SELECT TOP 20
total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(CASE WHEN qs.statement_end_offset = -1
THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
AS [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE execution_count>1
ORDER BY total_worker_time DESC
--平均耗CPU最多的前20个SQL:
SELECT TOP 20
total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms)],
max_worker_time /1000 AS [最大执行时间(ms)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(CASE WHEN qs.statement_end_offset = -1
THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
AS [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE execution_count>1
ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC