关于作者

用户名:smallmousel
笔名:smallmousel
地区: 北京-北京
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



友情链接

测试相关

访问统计:
文章个数:280
评论个数:43
留言条数:7




Powered by BlogDriver 2.1

云在天边,水在瓶

 

等待木木的日子.......

文章

SQLSERVER主外键的关联

http://hi.baidu.com/lyt1724/blog/item/c1488b02a304e20a4afb510d.html

在编写数据库相关程序时,对主外键的注意.

原先总认为主外键麻烦,没有去领会.

现在突然认识到库中键的重要性.

想在网上找一些有关文档说明,.可不多,(暂时没有想要的)

那就先看看SQL的技术帮助里的吧:

FOREIGN KEY 约束

外键约束与主键约束唯一约束一起在指定表中强制引用完整性。例如,可以在 publishers 表的 title_id 列中放置一个外键约束,以保证这一列中的输入值与 titles title_id 列中的现有值匹配。

在数据库关系图中,当创建从一个附加了主键约束或唯一约束的表到另一个表之间的关系时,外键约束将自动添加到指定的列上

外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。

例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。

FOREIGN KEY 约束并不仅仅只可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束不允许空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过 FOREIGN KEY 约束的校验。

说明   FOREIGN KEY 约束可引用同一数据库中的表或同一表(自引用表)内的列,例如,一个包含下面三列的雇员表:employee_numberemployee_namemanager_ employee_number。由于经理本身也是雇员,所以从 manager_employee_number 列到 employee_number 列存在外键关系。

尽管 FOREIGN KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers 表中删除一个出版商,而这个出版商的 ID 在 titles 表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles 表中该出版商的书籍因为与 publishers 表 中的数据没有链接而变得孤立了。FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的 行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。

FOREIGN KEY 约束是索引的候选约束,其原因有以下两点:

  • 对 PRIMARY KEY 约束的更改可由相关表中的 FOREIGN KEY 约束校验。

  • 当在查询中组合来自相关表中的数据时,经常在联接 条件中使用外键列,方法是将一个表的 FOREIGN KEY 约束中的列与另一个表中的主键列或唯一键列匹配。索引使 Microsoft® SQL Server™ 2000 得以快速查找外键表中的相关数据。但是,创建索引不是必需的。即使没有在表间定义 PRIMARY KEY 或 FOREIGN KEY 约束,也可以对来自两个相关表中的数据进行组合,但两个表间的外键关系说明已用其键作为条件对其进行了优化,以便组合到查询中。

以下是网上的一个小例子,

-- 创建表author :
CREATE TABLE [dbo].[author] (
[ID] [bigint] NOT NULL ,
[AuthorName] [char] (10) NULL ,
[address] [char] (480) NULL ,
[introduction] [ntext] NULL
)

-- 创建表myBBS:
REATE TABLE [dbo].[myBBS] (
[ID] [bigint] IDENTITY (1, 1) NOT NULL ,
[authorId] [bigint] NOT NULL ,
[Title] [char] (40) NULL ,
[Date_of_Created] [datetime] NULL ,
[Abstract] [char] (480) NULL ,
[Content] [ntext] NULL
)

设置表myBBS中的authorId为外键,参照author表的Id字段,直接使用transact sql语句,过程如下:
--增加表mybbs(authorId)的外键约束FK_mybbs_author,表myBBS中的authorId受表author中的主键ID约束:
BEGIN TRANSACTION
alter table dbo.mybbs add constraint FK_mybbs_author
foreign key (authorId)
references dbo.author([id]) ON UPDATE CASCADE ON DELETE CASCADE

--删除外键约束FK_mybbs_author:
--alter table dbo.mybbs drop constraint FK_mybbs_author
--rollback
commit transaction

上 面ON UPDATE CASCADE,ON DELETE CASCADE两个选项,指明以后author表的id字段有delete,update操作时,myBBS表中的id也会被级联删除或更新。如果没有选 中,是不可以对author表中已被myBBS表关联的id进行update或者delete操作的。

- 作者: smallmousel 2009年04月10日, 星期五 14:30  回复(0) |  引用(0) 加入博采

SQL--循环语句总结

使用游标方法:

declare @userid int
declare   a1_cursor Cursor     for  
    select usn from tbl_user where userid in(1,2,3,4,5,6,7) --查询条件语句
 
      open   a1_cursor  
      fetch   next   from   a1_cursor   into   @userid 
      while   @@fetch_status=0  
      begin  
          select   @userid  --在此可以调用存储过程来执行操作等
  &nbp;       fetch   next   from   a1_cursor   into   @userid 
      end  
      close   a1_Cursor  
      deallocate   a1_Cursor  

- 作者: smallmousel 2009年04月3日, 星期五 09:58  回复(0) |  引用(0) 加入博采

更改 Sql Server 2005 默认端口方法

http://www.yongfa365.com/Item/Sql-Server-2005-Change-Port.html

  1. SQL Server 配置管理器中,展开SQL Server 2005的网络配置,然后点击服务器实例如:MSSQLSERVER 的协议
  2. 在右窗格中,双击TCP/IP协议
  3. 在TCP/IP属性对话框中,单击IP地址选项卡。
  4. TCP端口框中的IPAll节,输入一个可用的端口号。对于本教程中,我们将使用1500。
  5. 单击确定以关闭该对话框,然后单击确定的警告说,必须重新启动服务。
  6. 在左窗格中,单击SQL Server 2005的服务
  7. 在右窗格中,右键单击SQL Server实例如:SQL Server (MSSQLSERVER),然后单击重新启动。当数据库引擎重新启动时,它将侦听端口1500 。

使用php等程序访问的时候:*.*.*.*:1500;

使用查询分析器或企业管理器连接:*.*.*.*,1500

- 作者: smallmousel 2009年04月1日, 星期三 15:00  回复(0) |  引用(0) 加入博采

windows xp远程桌面没有反应

今天发现windows xp远程桌面连接没有反应,看了3389端口都打开了。

日志里面有多条RDPDD.DLL Failed to Load,查了一下结果是ati显卡或nv显卡驱动程序造成的,确实是没想到,呵呵。
查到解决方法如下:
1.取消硬件加速功能;
2.修改注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management,新建DWORD键值,名称为SessionImageSize,值为00000020,然后重新启动
经实验,方法2可行!

- 作者: smallmousel 2009年03月26日, 星期四 12:27  回复(0) |  引用(0) 加入博采

QTP 10 破解

破解方法和前版本相同:
破解工具:mgn-mqt82  点击下载
1.下载、安装。
2.在C:\Program Files\Common Files\Mercury Interactive下创建文件夹:License Manager
3.将破解工具mgn-mqt82.exe复制到C:\Program Files\HP\QuickTest Professional\bin下。
4.运行mgn-mqt82.exe,ok,关闭。
5.用记事本打开License Manager下的lservrc文件,将第一行 # 前的代码Copy。
6.将代码paste到license向导中的license输入的地方,就可以了
http://bbs.51testing.com/viewthread.php?tid=140556&highlight=qtp%2B10%2Blicense

我在使用远程安装License的时候出现:

安装许可证密钥失败。
Error[19]:Failed to add license code "UNKNOWN" to the license server on host "no-net".

使用本地计算机登陆即可。

http://www.sqaforums.com/showflat.php?Cat=0&Number=497753&page=0&fpart=1&vc=1

I had the same problem.

It is because you are trying to install a Seat License while being connected using Remote Desktop (Terminal Client). You need to be behind the actual screen (or console), otherwise it only will let you install a concurrent license.

(Actually when you start QTP it explains exactly this, but I didn't notice the first, like, 300 times I tried).


- 作者: smallmousel 2009年03月18日, 星期三 15:45  回复(0) |  引用(0) 加入博采

中文UNICODE范围

4e00~9fbb

有的说4e00~9fa5

Java中Unicode的中文范围

 
若要判断是否是中文
只需要用以下代码:
for (int i = 0; i < sentence.length(); i++){
    char c = sentence.charAt(i);
    if ((c >= 0x4e00)&&(c <= 0x9fbb)){
        System.out.println("中文");
    }
}
 
下面是各语言在Unicode中的范围:
0000:Basic Latin 基本拉丁语
0080:Latin-1 Supplement 拉丁语-1补遗
0100:Latin Extended-A 拉丁语扩充-A
0180:Latin Extended-B 拉丁语扩充-B
0250:IPA Extensions 国际音标
02B0:Spacing Modifier Letters
0300:Combining Diacritical Marks 组合变音符
0370:Greek and Coptic 希腊语和埃及语
0400:Cyrillic 西里尔文
0500:Cyrillic Supplement 西里尔文补遗
0530:Armenian 亚美尼亚语
0590:Hebrew 希伯来语
0600:Arabic 阿拉伯语
0700:Syriac 叙利亚语
0780:Thaana 马尔代夫语
0900:Devanagari 梵文
0980:Bengali 孟加拉语
0A00:Gurmukhi 果鲁穆奇语
0A80:Gujarati 古吉特拉语
0B00:Oriya 奥里雅语
0B80:Tamil 泰米尔语
0C00:Telugu 泰卢固语
0C80:Kannada 埃纳德语
0D00:Malayalam 马拉雅拉姆语
0D80:Sinhala 锡兰语
0E00:Thai 泰国语
0E80:Lao 老挝语
0F00:Tibetan 西藏语
1000:Myanmar 玛雅语
10A0:Georgian 格鲁吉亚语
1100:Hangul Jamo (一种特殊韩文)
1200:ethiopic 埃塞俄比亚语
13A0:Cherokee 切罗基语
1400:Unified Canadian Aboriginal Syllabic
1680:Ogham 欧甘字母
16A0:Runic 古代北欧文字
1700:Tagalog 塔加拉语
1720:Hanunoo
1740:Buhid
1760:Tagbanwa
1780:Khmer 高棉语
1800:Mongolian 蒙古语
1900:Limbu
1950:Tai Le
19E0:Khmer Symbols 孟高棉语符号
1D00:Phonetic Extensions 语音扩充
1E00:Latin Extended Additional 拉丁扩充附加
1F00:Greek Extended 希腊语扩充
2000:General Punctuation 通用标点
2070:Superscripts and Subscripts 上标和下标
20A0:Currency Symbols 货币符号
20D0:Combining Marks for Symbols
2100:Letterlike Symbols
2150:Number Forms 数字形式
2190:Arrows 箭头
2200:Mathematical Operators 数学运算符
2300:Miscellaneous Technical 零杂技术用符号
2400:Control Pictures
2440:Optical Character Recognition
2460:enclosed Alphanumerics 带圈和括号的数字与字母
2500:Box Drawing 边框
2580:Block Elements 方块
25A0:Geometric Shapes 几何形状
2600:Miscellaneous Symbols 零杂符号
2700:Dingbats 丁贝符
27D0:Miscellaneous Mathematical Symbols-A 零杂数学符号
27F0:Supplemental Arrows-A 扩充箭头A
2800:Braille Patterns 盲文
2900:Supplemental Arrows-B 扩充箭头B
2980:Miscellaneous Mathematical Symbols-B 零杂数学符号B
2A00:Supplemental Mathematical Operators 扩充的数学运算符
2B00:Miscellaneous Symbols and Arrows 零杂符号和箭头
2E80:CJK Radicals Supplement CJK词根补遗
2F00:Kangxi Radicals Kangxi词根
2FF0:Ideographic Description Characters 表意符号
3000:CJK Symbols and Punctuation CJK符号和标点
3040:Hiragana 平假名
30A0:Katakana 片假名
3100:Bopomofo 汉语注音符号
3130:Hangul Compatibility Jamo
3190:Kanbun
31A0:Bopomofo Extended 汉语注音符号扩充
31F0:Katakana Phonetic Extensions
3200:enclosed CJK Letters and Months 带圈的CJK字母和月份
3300:CJK Compatibility CJK兼容
3400:CJK Unified Ideographs Extension A (1.5MB) CJK统一象形文字扩展A
4DC0:Yijing Hexagram Symbols 易经符号
4E00:CJK Unified Ideographs (5MB) CJK统一象形文字
A000:Yi Syllables 彝语音节
A490:Yi Radicals 彝语词根
AC00:Hangul Syllables (7MB) Hangul音节
D800:High Surrogates 高代用品
DC00:Low Surrogates 低代用品
E000:Private Use Area 私人保留区
F900:CJK Compatibility Ideographs CJK兼容象形文字
FB00:Alphabetic Presentation Forms 字母序的表象符
FB50:Arabic Presentation Forms-A 阿拉伯表象符A
FE00:Variation Selectors
FE20:Combining Half Marks
FE30:CJK Compatibility Forms
FE50:Small Form Variants
FE70:Arabic Presentation Forms-B 阿拉伯表象符-B
FF00:Halfwidth and Fullwidth Forms 半宽和全宽形式
FFF0:Specials 特殊符号
 

- 作者: smallmousel 2009年03月11日, 星期三 17:58  回复(0) |  引用(0) 加入博采

Windows常见性能计数器(较好的说明)

Windows常见性能计数器(较好的说明) 

http://blog.csdn.net/oobibigo/archive/2008/11/20/3341591.aspx

性能计数器(counter)是描述服务器或操作系统性能的一些数据指标。计数器在性能测试中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性、进行性能瓶颈的定位时,对计数器的取值的分析非常关键。但必须说明的是,单一的性能计数器只能体现系统性能的某一个方面,对性能测试结果的分析必须基于多个不同的计数器。

与性能计数器相关的另一个术语是“资源利用率”。该术语指的是系统各种资源的使用状况。为了方便比较,一般用“资源的实际使用/总的资源可用量”形成资源利用率的数据,用以进行各种资源使用的比较。

性能测试之内存篇(windows)

要监视内存不足的状况,请从以下的对象计数器开始:

· Memory\ Available Bytes

· Memory\ Pages/sec

Available Bytes剩余的可用物理内存,单位是兆字节(参考值:>=10%)。表明进程当前可使用的内存字节数。Pages/sec 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。

如果 Available Bytes 的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。如果 Pages/sec 的值为 20 或更大,那么您应该进一步研究页交换活动。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。

操作系统经常会利用磁盘交换的方式提高系统可用的内存量或是提高内存的使用效率。下列四个

指标直接反映了操作系统进行磁盘交换的频度。
Page Faults/sec

当处理器在内存中读取某一页出现错误时,就会产生缺页中断,也就是 page Fault。如果这个页

位于内存的其他位置,这种错误称为软错误,用Transition Fault/sec 来衡量;如果这个页位于硬盘上,必须从硬盘重新读取,这个错误成为硬错误。硬错误会使系统的运行效率很快将下来。Page Faults/sec这个计数器就表示每秒钟处理的错误页数,包括硬错误和软错误。
Page Input/sec
表示为了解决硬错误而写入硬盘的页数(参考值:>=Page Reads/sec)
Page Reads/sec
表示为了解决硬错误而从硬盘上读取的页数。(参考值: <=5)
Pages/sec
表示为了解决硬错误而从硬盘上读取或写入硬盘的页数(参考值:00~20)

必须同时监视 Available Bytes、Pages/sec 和 Paging File % Usage,以便确定是否发生这种情况。如果正在读取非缓存内存映射文件,还应该查看缓存活动是否正常。

Cathe Bytes
文件系统的缓存(默认为50%的可用物理内存)

内存泄露

· Memory\Available Bytes

· Memory\ Committed Bytes

如果您怀疑有内存泄露,请监视 Memory\Available Bytes 和 Memory\ Committed Bytes,以观察内存行为,并监视你认为可能在泄露内存的进程的 Process\ Private Bytes、Process\ Working Set 和Process\ Handle Count。如果您怀疑是内核模式进程导致了泄露,则还应该监视 Memory\ Pool Nonpaged Bytes、Memory\ Pool Nonpaged Allocs 和 Process(process_name)\ Pool Nonpaged Bytes。

private Bytes
进程无法与其他进程共享的字节数量。该计数器的值较大时,有可能是内存泄露的信号

检查过于频繁的页交换

由于过多的页交换要使用大量的硬盘空间,因此有可能将导致将页交换内存不足,这容易与导致页交换的磁盘瓶颈混淆。因此,在研究内存不足不太明显的页交换的原因时,您必须跟踪如下的磁盘使用情况计数器和内存计数器:

· Physical Disk\ % Disk Time

· Physical Disk\ Avg.Disk Queue Length

例如,包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。如果页面读取操作速率很低,同时 % Disk Time 和 Avg.Disk Queue Length的值很高,则可能有磁盘瓶径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。

要确定过多的页交换对磁盘活动的影响,请将 Physical Disk\ Avg.Disk sec/Transfer 和 Memory\ Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 0.1,那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况,那么您可能需要更多的内存。

研究程序的活动

接下来,检查正在运行的程序导致的过多的页交换。如果可能,请停止具有最高工作集值的程序,然后查看页交换速率是否有显著变化。如果您怀疑存在过多的页交换,请检查 Memory\ Pages/sec 计数器。该计数器显示由于页面不在物理内存中而需要从磁盘读取的页面数。(注意该计数器与 Page Faults/sec 的区别,后者只表明数据不能在内存的指定工作集中立即使用。)

性能测试之处理器篇(windows)

监视“处理器”和“系统”对象计数器可以提供关于处理器使用的有价值的信息,帮助您决定是否存在瓶颈。需要包含下列内容:

  • Processor\ % Total Processor Time 获得处理器整体使用情况。
  • 该计数值用于体现服务器整体的处理器利用率,对多处理器的系统而言,该计数值体现的是所有CPU的平均利用率。如果该值的数值持续超过90%,则说明整个系统面临着处理器方面的瓶颈,需要通过增加处理器来提高性能。

    要注意的是,由于操作系统本身的特性,在某些多CPU系统中,该数据本身并不大,但此时CPU之间的负载状况极不均衡,此时也应该视作系统产生了处理器方面的瓶颈。

    • 监视 Processor\ % Processor Time、Processor\ % User Time 和 % Privileged Time 以获得详细信息。

    Processor\ % User Time是指系统的非核心操作消耗的CPU时间,如果该值较大,可以考虑是否通过优化算法等方法降低这个值。如果该服务器是数据库服务器,Processor\ % User Time大的原因很可能是数据库的排序或是函数操作消耗了过多的CPU时间,此时可以考虑对数据库系统进行优化。

    • System\ Processor Queue Length 用于瓶颈检测。

    %Total Processor Time
    系统中所有处理器都处于繁忙状态的时间百分比,对于多处理器系统来说,该值可以反映所有处理器的平均繁忙状态,该值为100%,如果有一半的处理器为繁忙状态,该值为50%

    File Data Operations/sec
    计算机对文件系统进行读取和写入操作的频率,但是不包括文件控制操作

    Process Queue Length
    线程在等待分配CPU资源所排队列的长度,此长度不包括正在占有CPU资源的线程。如果该队列的长度大于处理器个数+1,就表示处理器有可能处于阻塞状态(参考值:<=处理器个数+1)

    %Processor Time
    CPU利用率,该计数器最为常用,可以查看处理器是否处于饱和状态,如果该值持续超过 95%,就表示当前系统的瓶颈为CPU,可以考虑增加一个处理器或更换一个性能更好的处理器。(参考值:<80%)

    %Priviliaged Time
    CPU在特权模式下处理线程所花的时间百分比。一般的系统服务,进城管理,内存管理等一些由操作系统自行启动的进程属于这类

    %User Time
    与%Privileged Time计数器正好相反,指的是在用户状态模式下(即非特权模式)的操作所花的时间百分比。如果该值较大,可以考虑是否通过算法优化等方法降低这个值。如果该服务器是数据库服务器,导致此值较大的原因很可能是数据库的排序或是函数操作消耗了过多的CPU时间,此时可以考虑对数据库系统进行优化。

    %DPC Time
    处理器在网络处理上消耗的时间,该值越低越好。在多处理器系统中,如果这个值大于50%并且%Processor Time非常高,加入一个网卡可能会提高性能。

    观察处理器使用情况的值

    要测量处理器的活动,请查看 Processor\ % Processor Time 计数器。该计数器显示处理器忙于执行非空闲线程所耗时间的百分比。

    检查处理器使用时,请考虑计算机的角色和所完成工作的类型。根据计算机进行的工作,较高的处理器值意味着系统正有效地处理较重的工作负载或正在努力维持。例如,如果正在监视用户的计算机,并且该计算机用于计算,计算程序可能容易使用 100% 的处理器时间。即使这会造成该计算机中其他应用程序的性能受到影响,但可以通过改变负载来解决。

    另一方面,在处理许多客户请求的服务器计算机中,100% 左右的值表示这些过程在队列中,正在等待处理器时间,并且造成瓶颈。如此持续高层次的处理器使用对服务器而言是无法接受的。

    考察处理器瓶颈

    进程的线程所需要的处理器周期超出可用周期时,处理器瓶颈将逐步显示出来。可以建立较长的处理器队列,并且系统响应会受到影响。处理器瓶颈两种常见的原因是 CPU 限制程序和产生过多中断的驱动程序或子系统组件。

    要决定是否由于对处理器时间的要求较高而存在处理器瓶颈,请查看 System\ Processor Queue Length 计数器。队列中包含两个或更多的项目则表明存在瓶颈。如果多个程序进程竞争大多数处理器时间,安装更快速的处理器会提高吞吐量。如果正在运行多线程的进程,附加处理器会有所帮助,但是请注意,附加处理器可能只有有限的益处。

    此外,跟踪计算机的服务器工作队列当前长度的 Server Work Queues\ Queue Length 计数器会显示出处理器瓶颈。队列长度持续大于 4 则表示可能出现处理器拥塞。此计数器是特定时间的值,而不是一段时间的平均值。

    要决定中断活动是否造成瓶颈,请观察 Processor\ Interrupts/sec 计数器的值,该计数器测量来自输入/输出 (I/O) 设备的服务请求的速度。如果此计数器的值明显增加,而系统活动没有相应增加,则表明存在硬件问题。

    也可以对生成中断的磁盘驱动器、网卡和其他设备活动的间接指示器监视 Processor\ % Interrupt Time 时间。

    注意

    要检测可能影响处理器性能的硬件问题,例如 IRQ 冲突,请观察 System\ File Control Bytes/second 的值。

    监视多处理器系统

    要观察多处理器计算机的效率,请使用下列附加计数器。

    计数器

    说明

    Process\ % Processor Time

    过程的所有线程在每个处理器上的处理器时间总和。

    Processor(_Total)\ % Processor Time

    计算机中所有处理器的处理器活动的度量。
    "N[{y8_0此计数器采样间隔期间的所有处理器平均非空闲时间的总和,并用处理器数目除以该和。51Testing软件测试网


    t#e_5I:N2y8@"a:X:Y
    例如,如果所有处理器平均忙半个采样间隔,则显示 50%。如果半数处理器忙整个间隔,而其他的处理器空闲,则也显示 50%。

    Thread\ % Processor Time

    线程的处理器时间数

    性能测试之磁盘篇(windows)

    监测对象:PhysicalDisk
    如果分析的计数器指标来自于数据库服务器、文件服务器或是流媒体服务器,磁盘I/O对这些系统来说更容易成为瓶颈。

    每磁盘的I/O数可用来与磁盘的I/O能力进行对比,如果经过计算得到的每磁盘I/O数超过了磁盘标称的I/O能力,则说明确实存在磁盘的性能瓶颈。

    下表给出了每磁盘I/O的计算公式:

    RAID类型

    计算方法

    RAID0

    (Reads+Writes)/Number of Disks

    RAID1

    (Reads+2*Writes)/2

    RAID5

    [Reads+(4*Writes)]/Number of Disks

    RAID10

    [Reads+(2*Writes)]/Number of Disks


    %Disk Time
    表示磁盘驱动器为读取或写入请求提供服务所用的时间百分比,如果只有%Disk Time比较大,硬盘有可能是瓶颈

    Average Disk Queue Length
    表示磁盘读取和写入请求提供服务所用的时间百分比,可以通过增加磁盘构造磁盘阵列来提高性能(<=磁盘数的2倍)

    Average Disk Read Queue Length
    表示磁盘读取请求的平均数

    Average Disk write Queue Length
    表示磁盘写入请求的平均数

    Average Disk sec/Read
    磁盘中读取数据的平均时间,单位是s

    Disk Bytes/sec 提供磁盘系统的吞吐率。
    决定工作负载的平衡
    要平衡网络服务器上的负载,需要了解服务器磁盘驱动器的繁忙程度。使用 Physical Disk\ % Disk Time 计数器,该计数器显示驱动器活动时间的百分比。如果 % Disk Time 较高(超过 90%),请检查 Physical Disk\ Current Disk Queue Length 计数器以查看正在等待磁盘访问的系统请求数量。等待 I/O 请求的数量应当保持在不大于组成物理磁盘的主轴数的 1.5 到 2 倍。

    Average Disk sec/Transfer
    磁盘中写入数据的平均时间,单位是s

    计数器反映磁盘完成请求所用的时间。较高的值表明磁盘控制器由于失败而不断重试该磁盘。这些故障会增加平均磁盘传送时间。一般来说,定义该值小于15ms最为优异,介于15-30ms之间为良好,30-60ms之间为可以接受,超过60ms则需要考虑更换硬盘或硬盘的RAID方式了

    Average Disk Bytes/Transfer

    值大于 20 KB 表示该磁盘驱动器通常运行良好;如果应用程序正在访问磁盘,则会产生较低的值。例如,随机访问磁盘的应用程序会增加平均 Disk sec/Transfer 时间,因为随机传送需要增加搜索时间。

    性能测试之网络篇(windows)

    监测对象:Network Interface
    网络分析是一件
    技术含量很高的工作,在一般的组织中都有专门的网络管理人员进行网络分析,对测试工程师来说,如果怀疑网络是系统的瓶颈,可以要求网络仍有来写真进行网络方面的检测。

    Network Interface\Bytes Total/sec为发送和接收字节的速率(包括帧字符在内)。可以通过该计数器的值判断网络连接速度是否是瓶颈,具体操作方法是用该计数器的值与目前的网络带宽进行比较。

    Byte Total/sec
    表示网络中接受和发送字节的速度,可以用该计数器来判断网络是否存在瓶颈(参考值:该计数器和网络带宽相除,<50%)

    性能测试之进程篇(windows)

    查看进程的%Processor Time值

    每个进程的%Processor Time反映进程所消耗的处理器时间。用不同进程所消耗的处理器时间进行对比,可以很容易的看出具体是哪个进程在性能测试过程中消耗了最多的处理器时间,从而可以据此针对应用进行优化。

    查看每个进程产生的页面失效

    可以用每个进程产生的页面失效(通过Process\Page Failures/sec计数器获得)和系统的页面失效(可通过Memory\Page Failures/sec计数器获得)的比值,来判断哪个进程产生了最多的失效页面,这个进程要么是需要大量内存的进程,要么是非常活跃的进程,可以对其进行中的分析。

    了解进程的Process\Private Bytes

    Process\Private Bytes是指进程所分配的无法与其他进程共享的当前字节数量。该计数器主要用拉判断进程在性能测试过程中有无内存泄漏。

    例如:对于一个IIS之上的web应用,我们可以重点监控inetinfo进程的Private Bytes,如果在性能测试过程中,该进程的Private Bytes计数器值不断增加,或是性能测试停止后一段时间,该进程的Private Bytes仍然持续在高水平,则说明应用存在内存泄漏。

    (备注:进程分析方法用到的计数器主要有:Process\%Processor Time、Page Failures/sec、Page Failures/sec、Private Bytes)

    相关链接:

    ① 内存映射文件机制

    内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,省去了读和写I/O的时间。

    比如使用memcpy等内存操作的函数。这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高。

    利用内存映射文件您可以认为操作系统已经为您把文件全部装入了内存,然后您只要移动文件指针进行读写即可了。这样您甚至不需要调用那些分配、释放内存块和文件输入/输出的API函数,另外您可以把这用作不同的进程之间共享数据的一种办法。运用内存映射文件实际上没有涉及实际的文件操作,它更象为每个进程保留一个看得见的内存空间。至于把内存映射文件当成进程间共享数据的办法来用,则要加倍小心,因为您不得不处理数据的同步问题,否则您的应用程序也许很可能得到过时或错误的数据甚至崩溃。

    内存映射文件本身还是有一些局限性的,譬如一旦您生成了一个内存映射文件,那么您在那个会话期间是不能够改变它的大小的。所以内存映射文件对于只读文件和不会影响其大小的文件操作是非常有用的。当然这并不意味着对于会引起改变其大小的文件操作就一定不能用内存影射文件的方法,您可以事先估计操作后的文件的可能大小,然后生成这么大小一块的内存映射文件,然后文件的长度就可以增长到这么一个大小。我们的解释够多的了,接下来我们就看看实现的细节:

    1. 调用CreateFile打开您想要映射的文件。
    2. 调用CreateFileMapping,其中要求传入先前CreateFile返回的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。
    3. 调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数返回指向映射到内存的第一个字节的指针。
    4. 用该指针来读写文件。
    5. 调用UnmapViewOfFile来解除文件映射。
    6. 调用CloseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。
    7. 调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。

    - 作者: smallmousel 2009年01月9日, 星期五 12:04  回复(0) |  引用(0) 加入博采

    Windows XP SP2 TCP/IP连接数的查看与修改

     Windows XP SP2 TCP/IP连接数的查看与修改

    http://blog.csdn.net/tsingmei/archive/2008/09/02/2867021.aspx

    这几天使用机器人对公司的一款游戏进行压力测试,发现需要的机器台数太多,想提高每台机器的TCP数量,结果发现了EvID4226Patch.exe(http://www.lvllord.de/download.php?url=en/EvID4226Patch211a-en.zip),结果不错,特此总结。

    - 作者: smallmousel 2008年12月22日, 星期一 10:38  回复(0) |  引用(0) 加入博采

    C#--获取客户端MAC地址

    http://www.cnblogs.com/kingboy/archive/2008/10/31/1025399.html

    为了CRM系统的安全性,今天领导要求员工登录时候都要验证他们电脑的信息,匹配之后才允许登录。我左思右想还是验证网卡的MAC吧。首先在Commond层加个获取网卡信息的类GetNetCardMAC

    using System;
    using
     System.Collections.Generic;
    using
     System.Text;
    using
     System.Management;

    namespace
     JL.CRM.Common
    {
        
    public  class
     GetNetCardMAC
        
    {
           
                
    private
     ManagementClass mc;
                
    private
     ManagementObjectCollection moc;
                
    public
     GetNetCardMAC()
                
    { }

                
    /// <summary>
                
    /// 取得设备网卡的MAC地址
                
    /// </summary>

                public  string GetNetCardMacAddress()
                
    {
                    mc 
    = new ManagementClass("Win32_NetworkAdapterConfiguration"
    );
                    moc 
    =
     mc.GetInstances();
                    
    string str = ""
    ;
                    
    foreachin
     moc)
                    
    {
                        
    if ((bool)mo["IPEnabled"== true
    )
                            str 
    = mo["MacAddress"
    ].ToString();

                    }

                    
    return str;
                }


            
        }

    }


      切记要引用命名空间:using System.Management
      心中窃喜,呵呵还是比较简单的。测试,晕 ! 这么做获取的是服务器的MAC。
      要获取客户端的MAC用C#做就比较复杂了。网上也有很多类似的例子,不过获取客户端的信息最好还是用客户端脚本比较好。下面是个JavaScript的获取MAC的例子(转):
     

    <HTML><HEAD><TITLE>WMI Scripting HTML</TITLE>
    <META http-equiv=Content-Type content="text/html; charset=gb2312">
    <SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
    document.forms[
    0].txtMACAddr.value=unescape(MACAddr);
    document.forms[
    0].txtIPAddr.value=unescape(IPAddr);
    document.forms[
    0].txtDNSName.value=unescape(sDNSName);
    //document.formbar.submit();
     
    </SCRIPT> 
     

    <SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
      
    if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
      
    {
       
    if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
       MACAddr 
    = objObject.MACAddress;
       
    if(objObject.IPEnabled && objObject.IPAddress(0!= null && objObject.IPAddress(0!= "undefined")
       IPAddr 
    = objObject.IPAddress(0);
       
    if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
       sDNSName 
    = objObject.DNSHostName;
       }

     
    </SCRIPT> 
     

    <META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
    <BODY>
    <OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
    <OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
    <SCRIPT language=JScript>
      
    var service = locator.ConnectServer();
      
    var MACAddr ;
      
    var IPAddr ;
      
    var DomainAddr;
      
    var sDNSName;
      service.Security_.ImpersonationLevel
    =3;
      service.InstancesOfAsync(foo, 
    'Win32_NetworkAdapterConfiguration');
      
    </SCRIPT> 
     

    <FORM id=formfoo name=formbar action=NICPost.asp method=post><INPUT value=00:05:5D:0E:C7:FA name=txtMACAddr> <INPUT value=192.168.0.2 name=txtIPAddr> <INPUT value=typ name=txtDNSName> </FORM></BODY></HTML>

    - 作者: smallmousel 2008年11月19日, 星期三 17:01  回复(0) |  引用(0) 加入博采

    ASP.NET(C#)获取客户端的网卡MAC代码

    ASP.NET(C#)获取客户端的网卡MAC代码

    http://www.cnblogs.com/winner/archive/2007/05/12/743605.html

    这两天在网上找关于获取客户端网卡的资料,网上差不多都是千篇一律的~试了好多代码,都不行~,昨天整理了一下,把代码发上来,希望对大家有所帮助吧~
    1,首先要添加引用:
    “项目”--“添加引用”---“using System.Runtime.InteropServices; ”

    2,代码:

      [DllImport("Iphlpapi.dll")]
      private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
      [DllImport("Ws2_32.dll")]
      private static extern Int32 inet_addr(string ip);


      private void Page_Load(object sender, System.EventArgs e)
      {
       try
       {
        string userip=Request.UserHostAddress;
        string strClientIP = Request.UserHostAddress.ToString().Trim();
        Int32 ldest = inet_addr(strClientIP); //目的地的ip
        Int32 lhost = inet_addr("");   //本地服务器的ip
        Int64 macinfo = new Int64();
        Int32 len = 6;
        int res = SendARP(ldest,0, ref macinfo, ref len);
        string mac_src=macinfo.ToString("X");
        if(mac_src == "0")
        {
         if(userip=="127.0.0.1")
          Response.Write ("正在访问Localhost!");
         else
          Response.Write ("欢迎来自IP为" + userip + "的朋友!" + "<br>");
         return;
        }

        while(mac_src.Length<12)
        {
         mac_src = mac_src.Insert(0,"0");
        }

        string mac_dest="";

        for(int i=0;i<11;i++)
        {
         if (0 == (i % 2))
         {
          if ( i == 10 )
          {
           mc_dest = mac_dest.Insert(0,mac_src.Substring(i,2));
          }
          else
          {
           mac_dest ="-" + mac_dest.Insert(0,mac_src.Substring(i,2));
          }
         }
        }

        Response.Write ("欢迎来自IP为"+userip+ "<br>" + ",MAC地址为"+mac_dest+"的朋友!"

         +   "<br>");
       }
       catch(Exception err)
       {
        Response.Write(err.Message);
       }


      }

    - 作者: smallmousel 2008年11月19日, 星期三 17:00  回复(0) |  引用(0) 加入博采