注册 | 登录
欢迎注册会员

当前位置:首页 > 数据库 > MSSQL数据库 > 正文

SQLServer I/O写入次数很高导致CPU100%

来源:程序人生 【 】 浏览:2651 添加日期:2010-08-12 11:02:04 我要评论(0)
1)看一下task?manager,?如果Sql?Server?占有的内存即使在服务器最忙得时候都不超过2GB,?而你有4GB内存,可以考虑在Windows?boot.ini启动文件中加入?/3GB变量。这样SqlServer就可以使用3GB的内存,多1GB意味着更大的缓存,可以不用到Disk取频繁读取了
2)?运行Perfmon,
加入“Page?Life?Expectancy”如果这个值始终小于300秒,意味着你需要更大的内存,
加入“Buffer?Cache?hit?ratio”?如果这个值小于90%,意味着你需要更大的内存.
加入?“Average?Disk?Queue?length”?如果总是大于2,意味着磁盘操作需要排队完成。考虑升级存储设备
3)运行profiler,跟踪器
只选Stored?procedure?和?T-Sql,?在Filter(过滤)?tab,?选duration(时长)大于5000,这告诉跟踪器只捕捉运行时间超过5秒的程序。?你可以根据自己的情况调整这个变量。目的是找到制造麻烦的SQL.
4)运行sp_who2?,看blk?by?栏,?如果这栏不是空白,?有一个数字,?这就是造成阻塞(blocking)的线程id.?然后运行DBCC?Inputbuffer(线程id),?你就可以看见这个线程在干什么。
5)确认你的客户端程序使用connection?pooling,并在完成任务后关闭连接。Sqlserver默认255个连接,如果使用connection?pooling,?这个值应该足够应付大多数情况。?如果你确认255不够,可以使用sp_configure重设这个值
6)以上都是在认为你完成数据库日常维护的前提下。?如果你不做日常维护,请立即开始。?经常用?DBCC?indexDefrag.?每隔一段时间用DBCC?DBREINDEX?重建?index.?你可以运行?DBCC?Showcontig,?然后看Scan?Density?,如果主要的大表Scan?Density?
??

DBCC?SHOWCONTIG?执行后,结果全部类似下面片断
DBCC?SHOWCONTIG?正在扫描?'sysobjects'?表...
表:?'sysobjects'(1);索引?ID:?1,数据库?ID:?12
已执行?TABLE?级别的扫描。
-?扫描页数.....................................:?586
-?扫描扩展盘区数...............................:?91
-?扩展盘区开关数...............................:?585
-?每个扩展盘区上的平均页数.....................:?6.4
-?扫描密度[最佳值:实际值]....................:?12.63%[74:586]
-?逻辑扫描碎片.................................:?47.27%
-?扩展盘区扫描碎片.............................:?97.80%
-?每页上的平均可用字节数.......................:?2209.8
-?平均页密度(完整)...........................:?72.70%
写了个类,用于从结果中挑出需要重建索引的表并生成sql语句?
Java Code复制内容到剪贴板
  1. import?java.io.BufferedReader;? ??
  2. import?java.io.FileNotFoundException;? ??
  3. import?java.io.FileReader;? ??
  4. import?java.io.IOException;? ??
  5. import?java.io.InputStreamReader;? ??
  6. /**? ?
  7. *?Read?a?file?and?print,?using?BufferedReader?and?System.out? ?
  8. */? ??
  9. public?class?CatFile?{? ??
  10. ??public?static?void?main(String[]?av)?{? ??
  11. ????av?=?new?String[1];? ??
  12. ????av[0]?=?"e:\DBCC?Showcontig.TXT";? ??
  13. ????CatFile?c?=?new?CatFile();? ??
  14. ????if?(av.length?==?0)?{? ??
  15. ??????c.process(new?BufferedReader(new?InputStreamReader(System.in)));? ??
  16. ????}? ??
  17. ????else?{? ??
  18. ??????for?(int?i?=?0;?i?
  19. ????????try?{? ??
  20. ??????????c.process(new?BufferedReader(new?FileReader(av)));? ??
  21. ????????}? ??
  22. ????????catch?(FileNotFoundException?e)?{? ??
  23. ??????????System.err.println(e);? ??
  24. ????????}? ??
  25. ??????}? ??
  26. ????}? ??
  27. ??}? ??
  28. ??/**?print?one?file,?given?an?open?BufferedReader?*/? ??
  29. ??public?void?process(BufferedReader?is)?{? ??
  30. ????try?{? ??
  31. ??????String?inputLine;? ??
  32. ??????String?tableName?=?"";? ??
  33. ??????while?(?(inputLine?=?is.readLine())?!=?null)?{? ??
  34. ????????double?density?=?0;? ??
  35. ????????if?(inputLine.indexOf("表:?'"?>=?0)?{? ??
  36. ??????????tableName?=?inputLine.substring(inputLine.indexOf("'"?+?1,? ??
  37. ??????????????????????????????????????????inputLine.indexOf("'(");? ??
  38. ????????}? ??
  39. ????????if?(inputLine.indexOf("扫描密度"?>=?0)?{? ??
  40. ??????????density?=?Double.parseDouble(inputLine.substring(inputLine.indexOf(? ??
  41. ??????????????"..:?"?+?4,?inputLine.indexOf("%["));? ??
  42. ??????????if?(density?<=?40.0)?{? ??
  43. ????????????//System.out.print("density--"?+?density);? ??
  44. ????????????//System.out.print("????";? ??
  45. ????????????System.out.println("DBCC?DBREINDEX?("?+?"'"?+?tableName?+? ??
  46. ??????????????????????????????"','',80)";? ??
  47. ??????????}? ??
  48. ????????}? ??
  49. ??????}? ??
  50. ??????is.close();? ??
  51. ????}? ??
  52. ????catch?(IOException?e)?{? ??
  53. ??????System.out.println("IOException:?"?+?e);? ??
  54. ????}? ??
  55. ??}? ??
  56. }?? ??
  57. ??
??

?

回复:SQLServer?I/O写入次数很高?CPU100%
1)你用不上AWE,因为你只有4G内存,32bit系统可以处理4G内存。?超过4G才需要激活AWE.
2)一般你应该对用户表进行DBCC?SHOWCONTIG,?但你有几万个表,整理一下系统表的index碎片也许会有帮助。你可以?DBCC?dbreindex你的sysobjects表。?扫描密度12.63%太低了。
3)看来你的系统主要以插入为主。你可以考虑作几件事情
a.看一下你的insert?sql,?看能不能把尽可能多的insert,update?放到一个transaction里面,因为如果不这么做,每个insert都要commit,要求一个写操作到transaction?log.-->I/O
b.如果可以,可以考虑simple?recovery?mode,?而不是?full?recovery?mode.可以减少transaction?log?i/o
c.?看一下你表的设置,index?fill?factor是什么值?如果你的表有频繁大量写入。可以考虑把?fill?factor?设在70%左右。这样可以减少page?split,同样减少IO消耗。
d.考虑把transactionlog?放在和数据不同的物理盘上
e.把你的10000张表归类,放在不同的文件组(file?group)里,再把各个filegroup放到不同的物理盘上
d,?e?需要升级你的存??

?

Total of 2Prev12Next

你浏览的文章是 - 《SQLServer I/O写入次数很高导致CPU100%》!
文章出处:https://www.procedurelife.com/content/akkhlb.html
0% (0)
0% (0)
评论0
头像 游客
1 2