K2上海总部技术培训分享笔记

第一部门 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

http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx

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/

Tess博客:http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx

Windbg命令:http://www.windbg.info/doc/1-common-cmds.html

SOS命令:http://msdn.microsoft.com/zh-cn/library/bb190764(vs.80).aspx

原文地址:https://www.cnblogs.com/K2China/p/K2_shanghai_training.html