我想将给定的一组 Windows 性能计数器的数据直接记录到 SQL Server 表中。Windows 是否提供了一种无需编写自定义应用程序即可执行此操作的方法?
如果是这样,那么这样做是否存在严重问题?
答案1
是的,这是可能的。以下是基于这文章。
选择要分析的计数器
将本地机器上的所有计数器导出到本地文件夹。
typeperf -q > counters.txt
编辑导出的文件,只留下要采样的计数器。我留下了以下两个:
\Processor(*)\% Processor Time
\Memory\Pages/sec
收集数据
在这里您将收集想要使用 logman 分析的数据。
创建一个集合。
logman create counter MyCollection -s %computername% -cf counters.txt
开始记录
logman MyCollection start
一旦收集到了代表性样本,就停止采集。
logman MyCollection stop
默认情况下,在 Vista 和 Windows 2008 服务器上,您的性能监视器计数器将存储在 %systemdrive%\PerfLogs\Admin 中,并以您的集合名称命名(在我们的例子中,它们将被称为 MyCollection.blg,因此,您需要转到此文件夹。
cd %systemdrive%\PerfLogs\Admin
加载到 SQL Server
创建 ODBC 数据源。警告:SQL Server Native Client 不能与 perfmon 一起使用。Perfmon 是一个 Windows 工具,只能与使用 Windows 附带的 MDAC SQLODBC 驱动程序的 DSN 一起使用。
我创建了一个名为 relogDSN 的 ODBC 数据源。ServerName 是我收集数据的服务器的名称。此名称将写入创建的 SQL Server 表 DisplayToID,当我想查看计数器时,我可以查询它。
relog MyCollection_000001.blg -f SQL -o SQL:relogDSN!ServerName
分析数据
您的计数器将被保存到表 CounterDetails、CounterData 和 DisplayToID 中,这里有一个 SQL 查询作为示例。
SELECT MachineName,
CONVERT(DATETIME, CONVERT(VARCHAR(16), CounterDateTime)) as [Date],
AVG(CounterValue) as Average,
MIN(CounterValue) as Minimum,
MAX(CounterValue) as Maximum
FROM CounterDetails
JOIN CounterData ON CounterData.CounterID = CounterDetails.CounterID
JOIN DisplayToID ON DisplayToID.GUID = CounterData.GUID
GROUP BY MachineName,
CONVERT(DATETIME, CONVERT(VARCHAR(16), CounterDateTime))
答案2
Windows 中没有内置方法将 PerfCounters 写入 SQL 数据库。您必须编写一个工具来执行此操作。