第一部门 WinDdg 入门指南
1、NGen.exe --> native code 预编译,省去了.NET程序编译器JIT过程,是程序第一次运行也非常快。
NGen 参考资料:http://msdn.microsoft.com/zh-cn/library/6t9t5wcf.aspx
2、在不同版本下查看dump
.NET 2.0/.NET 3.0/.NET 3.5
!loadby sos mscorwks或!loadby [sos文件路径]
.NET 4.0
!loadby sos clr
3、查看dump中Appdomain,assembly, module,mt使用的基本语法,!dump+查看的类型
!dumpdomain 查看所有的appdomain
!dumpassembly xxxxxx 查看指定的应用程序集
!dumpmodule xxxxxx –mt 查看指定类(模块)
!dumpmd xxxxxx 查看方法
!u: 查看二进制汇编代码
!dumpil [地址代码]:根据内存地址查看中间代码
Adplus.exe/adplus.vbs:抓取dump的文件,版本不同,会有不同adplus文件
-hang/-crash:使用adplus抓取dump的参数,二者选其一,建议生产环境中不要使用-crash
!eeheap/!eestack: 一个进程一个栈,一个栈是1M内存
!clrstack:看程序堆栈调用情况,也看托管代码
!thread:看托管线程
!~:看所有线程
1个thead的栈默认空间:1MB ,如果有2000个线程,2G的内存就挂了;
一般设计最好是用线程池,控制总的线程数
~1s [切换到1号线程]
!clrstack [查看该线程的托管代码调用堆栈,可以看到该线程所执行的线程方法]
!dumpstack 查看堆栈跟踪(非托管和托管的堆栈都显示)
KB 看二进制,费托管代码
!dso 查看目前栈上的所有对象
!help 查看帮助
第二部分 WinDbg 实战
2g * 60% = 1.2g : 32位的操作系统,ASP.NET程序默认可以使用的最大内存大小
调整ASP.NET最大使用内存比例
machine.config comment
processmodel
memorylimit = "60"
client --> iis(超过5000,进入queue) --> thread pool(超过20*8,进入queue)
managed heap 托管堆
loader heap 引用堆
public class demo { int a = 0 ; //heap public void F1() { int b = 0 ; // stack } }
lock(this) 不好,lock(typeof(..)) 最不好不要lock值类型。
垃圾回收过程(GC) :
iis w3wp : 100 threads,其中挂起, 60 managed threads(挂起时,所有的managed线程都不会工作)
suspendEE
Mark :找对象有没有ROOT的对象 引用ROOT
PLAN:
restartEE
标记没有根的对象,删除掉,整理内存(Compact,使内存整片存在,避免OOM),把G0中没有删除的对象,COPY到G1 。
当新对象来的时候,G0有可能有两种:1是扩展 ,2是回收
当G1满的时候,G1 -> G2
g0:g1:g2(回收次数)
正常情况下:100:10:1
如果G0,G1,G2回收次数都基本相同时,说明内存不够用,频繁的FULL GC,OOM ,内存的碎片也会形成的OOM
.NET CLR Memory 性能计数器
This counter displays the current size of the Large Object Heap in bytes. Objects greater than 20 85 KBytes are treated as large objects by the Garbage Collector and are directly allocated in a special heap; they are not promoted through the generations. This counter is updated at the end of a GC; its not updated on every allocation.
%time in gc (10%~ 15%) < 20%
LOH
1.只有在FULL GC时才会回收
2.回收时,不会做Compact压缩转移(可能会出现碎片)
if broker it
tinyget -srv:localhost
http://support.microsoft.com/kb/840671/zh-cn
debugdiag c++
adplus_old -hang -pn w3wp.exe -quiet -o c:\dumps
(抓的话,会挂起)
Mem usage 物理内存会涨
quiet:交互方式
高内存的分析步骤:
1. 是否.NET内存使用的多
2.内存占用比例
3.占用内存最大的几种对象
4.为什么没有垃圾回收(找到ROOT)
!eeheap -gc (查看.NET使用的大小)
!dumpheap -stat (得到内存占用比例,相当于Group by)
!dumpheap -type stystem.string = !dumpheap -mt 1342112
!dumpheap -mt XXXX -min 20019 -max 20021 -stat
!gcroot XXXXXX(随机找一个ID,查出Root)
!finalizequeue
!runaway (查看线程的CPU使用时间)
.time 指定线程的CPU使用时间
Finalize
public class link { ~Link() //Finalize }
如果写了析构函数,对象需要2次GC才释放
Finalize Thread进行Finalize queue
High MEM会导致High CPU 因为垃圾回收导致的
logfiles
iisweb /query
httperr 大于400的错误
eventvwr
.symfix + c:\symbols 加装符号表 (下载PDB)
.reload
Kb 看二进制的
>>> 当前运行的行
!objectsize 121212 看对象的大小
!do
.time
!runaway
~11s
.loadby sos mscorwks
!clrstack
!u 1212312
>>>
!ip2md 1212312
IIS recycle 建议使用
~* e!clrstack 看所有线程
!syncblk 查看lock的线程(分析)
.chain 查看SOS
DW20.EXE --> doctor watson 出问题的时候诊断进程
server unavailable 通过IIS的站点的应用程序池设置失败保护
1st chance 一般从这个开始查
2chance 比较严重,Exception 已经抛到OS
adplus_old - -pn w3wp.exe -quiet -o c:\dumps
-fullonfirst
sxe clr 开启Exception的抓取
!pe 打印异常
stackoverflow 1M / 4 = 25w次的调用 a里面调b, b里面调用a
性能计数器alert ,当某个计数器的值达到某个阀值时,可以执行某个程序。
第三部分 SQL Server 调优
设置SQL Server的内存使用
16g -> 12000(m)
32g -> 26~28
64g -> 56~58
原则:需要给系统留4~6g内存
max degree of pata 最大并行度: 设置成1(有几个solts CPU设成几)
X86 用4G以上的内存
1.AWE 勾上
2.需要改boot.ini
3.组策略
lock pages memery
数据库文件推荐的增长策略 200M
select count(0) from _line with(nolock)
逻辑读 是以page为单位
RID lookup 文件号 非聚集时的指针到内容的查找
search arguments
创建索引的推荐办法:
create index ix
(cond1,cond2,cond3) ---条件列
include(col1,col2,col3) ---数据输出列
在创建索引时可以增加条件,当符合条件时才使用该索引,该特性对于少众数据的筛选非常有用( type中80%是1 , 15%是2, 5%是3 )
create index ix
where type=3
查看系统认为缺失的索引
sys.dm_db_missing_index_details
dbcc traceon(1222,3605,-1) 开启死锁的日志 >= sql2005
-1代表所有的库
select db_id('dbname1')
监控中starting没用
proc stmcompleted 记录存储过程中所有语句的执行情况
sys.sysprocesses 查看SQL Server中的进程情况
select @spid 查看SQL当前进行的编号
reads > 10000
user connections :sql general statistics
batch requests :sql statistics
page file expectancy :sql buffer manager
第四部分 一些有用的网址
鞠强博客:http://www.cnblogs.com/juqiang/
鞠强同事博客:http://www.cnblogs.com/StevenChennet/
Windbg命令:http://www.windbg.info/doc/1-common-cmds.html
SOS命令:http://msdn.microsoft.com/zh-cn/library/bb190764(vs.80).aspx