posts - 32,comments - 69,trackbacks - 6

作者:终南   <li.zhongnan@hotmail.com>

 

 

 

 

 

 

磁盘的IO性能是衡量计算机总体性能的一个重要指标。Linux提供了iostat命令来获却磁盘输入/输出(即IO)统计信息,Windows则提供了WMI接口,可以通过编写一个简单的脚本来获取与iostat相当的功能。

1、Linux下的iostat命令

iostat -d -k -t 2

每隔2秒统计一次磁盘IO信息,直到按Ctrl+C终止程序,-d 选项表示统计磁盘信息, -k 表示以每秒KB的形式显示,-t 要求打印出时间信息,2 表示每隔 2 秒输出一次。第一次输出的磁盘IO负载状况提供了关于自从系统启动以来的统计信息。随后的每一次输出则是每个间隔之间的平均IO负载状况。

运行该命令后,输出:

Linux 2.6.9-67.0.7.ELsmp (localhost.localdomain)        11/19/2008

Time: 03:15:25 PM
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               3.53        26.66        54.76   30122033   61864280
sda1              0.51         1.07         1.73    1207649    1949740
sda2              0.00         0.00         0.00        538        256
sda3             13.84        25.59        53.03   28913291   59914092

Time: 03:15:27 PM
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             275.38         0.00      1738.69          0       3460
sda1             14.57         0.00        58.29          0        116
sda2              0.00         0.00         0.00          0          0
sda3            419.60         0.00      1678.39          0       3340

...

每次输出都会打印时间信息, 接下来显示磁盘IO情况列表。

Device: 显示磁盘名称
tps: 表示每秒钟输出到物理磁盘的传输次数。一次传输就是一个对物理磁盘的 I/O 请求。多个逻辑请求可被并为对磁盘的一个单一 I/O 请求。传输具有中等的大小。
kB_read/s: 每秒从磁盘读取的数据量,单位为KB。
kB_wrtn/s: 每秒从写入磁盘的数据量,单位为KB。
Kb_read: 读取的 KB 总数。
Kb_wrtn: 写入的 KB 总数。

2、WMI中的 Win32_PerfFormattedData_PerfDisk_LogicalDisk 对象

Win32_PerfFormattedData_PerfDisk_LogicalDisk 代表逻辑磁盘性能数据对象,利用该对象可以获得磁盘的心能信息。Win32_PerfFormattedData_PerfDisk_LogicalDisk对象有以下一些主要的属性:

Name: 磁盘名称
DiskTransfersPerSec:每秒磁盘传输次数。
DiskReadBytesPerSec:每秒从磁盘读取得数据量,单位为Byte。
DiskWriteBytesPerSec:每秒从磁盘读取得数据量,单位为Byte。
PercentFreeSpace:可用磁盘百分比。

3、使用 Win32_PerfFormattedData_PerfDisk_LogicalDisk 的注意事项

在使用 Win32_PerfFormattedData_PerfDisk_LogicalDisk 时,需要注意:

(1)不能使用 objWMIService.ExecQuery 执行 Select 语句来获取磁盘性能数据
(2)必须使用 WbemScripting.SWbemRefresher 将 Win32_PerfFormattedData_PerfDisk_LogicalDisk 加入,然后不断调用 Refresh 方法刷新数据来获取性能信息
(3)第一次刷新的时候,并不能获取有用的数据,从第二次开始,才能获取到磁盘性能数据
(4)以上问题与 WMI 中性能监控使用计数器的机制有关

4、使用举例

为了对监控磁盘性能提供一个良好的用户界面,可以利用VBScript编写脚本来获取磁盘性能数据。脚本的代码如下:

'Script File Name: DiskMonitor.vbs

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colDisks = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSet

If Wscript.Arguments.Count = 0 Then
objRefresher.Refresh
For Each objDisk in colDisks
   Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSec
Next
End If

If Wscript.Arguments.Count = 1 Then
Interval = CInt(Wscript.Arguments(0)) * 1000
Do While True
   objRefresher.Refresh

   Wscript.Echo
   Wscript.Echo "Time: " & " " & Time()
   Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr("    kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)

   For Each objDisk in colDisks
    Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1)
   Next
   Wscript.Sleep Interval
Loop
End If

If Wscript.Arguments.Count = 2 Then
i = 0
Interval = CInt(Wscript.Arguments(0)) * 1000
Count = CInt(Wscript.Arguments(1))
Do While i < Count
   objRefresher.Refresh

   Wscript.Echo
   Wscript.Echo "Time: " & " " & Time()
   Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr("    kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)

   For Each objDisk in colDisks
    Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1)
   Next
   Wscript.Sleep Interval
   i = i + 1
Loop
End If

Function FormatStr(str, tLen, direction)
sLen = Len(str)
fStr = ""
num = tLen - sLen

j = 0
Do While j < num
   fStr = fStr & " "
   j = j + 1
Loop

If direction = 1 Then
   fStr = fStr & str
Else
   fStr = str & fStr
End If
FormatStr = fStr
End Function


使用举例:

(1)CSCript DiskMonitor.vbs
止刷新一次 Win32_PerfFormattedData_PerfDisk_LogicalDisk 对象,不会获取到有用的数据。

(2)CSCript DiskMonitor.vbs 2
每隔 2 秒获取一次磁盘性能数据并输出,直到按 Ctrl+C 终止程序。

(3)CSCript DiskMonitor.vbs 2 100
每隔 2 秒获取一次磁盘性能数据并输出,总共获取 100 次,然后退出。

该脚本输出的信息包括 DiskTransfersPerSec、DiskReadBytesPerSec、DiskWriteBytesPerSec 和 PercentFreeSpace。

posted @ 2008-11-21 11:47 李佩亮 阅读(151) | 评论 (0)编辑

服务器中安装Windows 2003 x64 MSDN 后,发现系统日志中经常报错,而且也无法进行系统升级。

系统日志中错误如下:
Background Intelligent Transfer Service 服务因下列错误而停止:
系统找不到指定的文件。


修复过程:
按以下顺序执行修复操作,每一步都检查服务是否恢复,如果没有恢复,再进入下一步过程继续修复。

(理论上该修复过程可以在任一 Winnt 5.X 的所有系统上执行:winxp win2k,win2k3 等)


1.命令行模式下,输入以下命令:

%windir%\System32\rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %windir%\inf\qmgr.inf

期间会需要系统安装光盘。
完成后重启,检查服务是否恢复。

2.命令行模式下,输入以下命令:

Reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BITS\Parameters /v ServiceDll /t REG_EXPAND_SZ /d %windir%\System32\qmgr.dll

完成后重启,检查服务是否恢复。

3.命令行模式下,输入以下命令:

Reg add HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToBackup

完成后重启,检查服务是否恢复。

4.命令行模式下,依次输入以下命令:

regsvr32 oleaut32.dll
regsvr32 jscript.dll
regsvr32 vbscript.dll
regsvr32 msxml.dll
regsvr32 softpub.dll
regsvr32 wintrust.dll
regsvr32 initpki.dll
regsvr32 cryptdlg.dll

完成后重启,检查服务是否恢复。

5.删除以下目录:

C:\Documents and Settings\All Users\Application Data\Microsoft\Network\downloader

完成后重启,检查服务是否恢复。

6.命令行模式下,输入以下命令:
sfc /scannow


顺便说一下经验操作:
可以连续执行步骤1-2 后,再进行不重启,即可恢复服务。

posted @ 2008-11-16 11:58 李佩亮 阅读(621) | 评论 (0)编辑

现在做一个项目,完全使用XSD,如果采用Image 默认的byte[]  方式输出成XML ,就会很崩溃,会输出如下:

<Image>

     <byte>-1</byte>
     <byte>-12</byte>
     <byte>158</byte>
     <byte>-2</byte>
     <byte>222</byte>

     ..........................

     <byte>-1</byte>

</Image>

一张 290× 200 的图片,Jpeg 格式,大约需要输出14万行的byte 数组。图片还不到20K,但输出的字符串却大约有600K。这样的方案于情于理是完全说不通的。

解决办法:

     采用目前比较流行的Base64 方式,将byte[] 数组转换为字符串,这样就减少了输出,同时也不受机器Code 的影响。

转换代码:

Image --> Base64String

Code

 

Base64String --> Image

Code
posted @ 2008-10-31 12:04 李佩亮 阅读(217) | 评论 (0)编辑

发现在XSD 中,节点为Image 类型,转换出的cs 代码中却是 sbyte[] 类型的。

查阅MSDN ,告知sbyte 和 byte 需要显示转换。

由查阅网上不少文章,发现大家碰到这个转换,大多都采用 for 循环解决。-_-!

(了解至此我异常崩溃,由于要转换图片,数组的Lenght大约有20万条)。

 

不过有幸翻到了一个老外写的转换代码,非常好使,两行搞定,遂共享给大家:

Code
posted @ 2008-10-31 11:10 李佩亮 阅读(143) | 评论 (0)编辑

这里我采用事件方式进行控件的拖动,以下针对Control 定义了三个通用的事件和一个变量。

使用的时候只需要对需要拖动的控件绑定以下这三个事件就好了,控件就可以自由拖动了。:)

相信大家也都能看明白,这里就不多说什么了。

Code
posted @ 2008-10-28 00:13 李佩亮 阅读(273) | 评论 (1)编辑

平时用的的确确是少,回来想起来已经忘记了不下3次了,搞得每次都要去网上现找,索性写到博客中作为记录。

基本理论:

     控件的背景色往往是从父控件继承来的。

比如在PictureBox 上面放置一个背景透明的Label,做法可如下:

     label1.Parent = pictureBox1; //设定Label 的父控件为PictureBox
     label1.BackColor = Color.Transparent; //设定背景为透明。

posted @ 2008-10-27 23:49 李佩亮 阅读(214) | 评论 (0)编辑

解决方法一:加一个exception异常处理

  exception when no_data_found then

    ....

 

解决方法二:更改select语句,如:

  select count(*) field into var from table where ....

增加一个count(*)即使没有找到数据,也会返回0,而不是null。

posted @ 2008-10-17 13:21 李佩亮 阅读(729) | 评论 (0)编辑
     接近11月份了,北京这严酷的天气也渐渐凉了起来,街边露腿的美女是越来越少了,可这该死办公室的温度却是一天比一天热起来,搞得我又继续翻出夏天的短袖... -_-!

     透过窗帘看看天上继续火辣的TY,不由得一边诅咒这玻璃大楼的设计人员不留大点的窗户,一边诅咒这无良的物业公司不顾大家的疾苦而停掉中央空调。

     由于温度过高,小扇子已经不顶用了,遂动手制作大风扇一把,自己创造凉爽宜人以及悠然自得的新境界。

     材料如下:1M网线1根,筷子1根,废旧光盘6张。

制作过程如下:

     由于制作过程比较简易,为了体现对大家智商尊重,这里不再赘述。直接上图。

     ----->  注意图中I-fan 字样及相关图标。我已使用,如有仿制,请勿侵权。 <----- -_-#!

全身躺照:

 

手持正面照:

 

手持反面照:(由于制作工艺原因,背面细节没有处理完善,待改进)

 

完成之后的下一步设想,I-fan mini版,材料使用:

1.mini 光盘

2.牙签

3.普通细线

 

借鉴某位同僚的工作思路来讲一下我对 I-fan 的效益设想:

     希望2年内,I-fan 能够量产,以便彻底解决废旧光盘和废旧筷子、网线的垃圾处理问题,并出口东南亚,亚非拉甚至拉丁美洲。

     当然I-fan 能够上市我也是不拒绝的,希望风投或天使资金啥的联系我!

 

备注:

     -_-! (写完此脑残随笔,我自己先寒一个!)......

 

posted @ 2008-10-14 12:27 李佩亮 阅读(137) | 评论 (3)编辑

GUID 大家估计都会偶尔用一下的,但原GUID字符串太长,在现实项目中通常还是短的好用,而且也能保证其唯一性。

这里介绍两个方法:

原理其实很简单,不做太多赘述。

 

产生字符串:(例:49f949d735f5c79e)

private string GenerateId()
{
 
long i = 1;
 
foreach (byte b in Guid.NewGuid().ToByteArray())
 
{
  i 
*= ((int)b + 1);
 }

 
return string.Format("{0:x}", i - DateTime.Now.Ticks);
}

 

产生Int64 类型:(例:4833055965497820814)

private long GenerateId()
{
 
byte[] buffer = Guid.NewGuid().ToByteArray();
 
return BitConverter.ToInt64(buffer, 0);
}


 

 

可以参考原文:Generate unique strings and numbers in C#

 

posted @ 2008-07-24 18:19 李佩亮 阅读(116) | 评论 (0)编辑
关于iscsi target 的简单Q&A
http://iscsitarget.sourceforge.net/wiki/index.php/FrequentlyAskedQuestions

关于iscsi target deamon 的一些开发信息
http://iscsitarget.sourceforge.net/wiki/index.php/ManagementDaemon

台湾老师写的一个关于 IET 安装的PPT 不过比较简单(我可是提供我自己的网站下载哦!)
http://www.imgoto.com/download/iscsi_enterprise_target.rar

回头我再收集一些,还会陆续放上来。

posted @ 2008-03-20 11:33 李佩亮 阅读(195) | 评论 (1)编辑