Có thể chạy perfmon trên các máy chủ sản xuất không? Và tại sao?


28

Hoặc perfmon nên được giới hạn trong một máy chủ Dev / QA với các bài kiểm tra tải mô phỏng hoạt động sản xuất?

Tôi muốn chạy perfmon trong hai ngày ( như Brent Ozar, chủ nhân của Sql Server gợi ý ) để có được cảm nhận chung về hiệu suất cơ sở dữ liệu của ứng dụng web của tôi.


1
Một số người đã đề xuất sử dụng Dấu vết SQL - hãy thận trọng với dấu vết SQL và không bao giờ theo dõi tất cả hoạt động trên máy chủ prod.
Sam

Câu trả lời:


26

SQL Server và hầu hết các sản phẩm khác, luôn tạo bộ đếm, bất kể có người nghe hay không (bỏ qua tùy chọn khởi động -x). Truy tìm dấu vết là hoàn toàn minh bạch trên ứng dụng đang được theo dõi. Có một vùng bộ nhớ dùng chung mà ứng dụng được theo dõi ghi và từ đó các phiên giám sát đọc các giá trị thô tại khoảng thời gian được chỉ định. Vì vậy, chi phí duy nhất liên quan đến giám sát là chi phí của quá trình giám sát và chi phí để ghi các giá trị được lấy mẫu vào đĩa. Chọn khoảng thời gian thu thập hợp lý (tôi thường chọn 15 giây) và số lượng bộ đếm vừa phải (50-100) và viết vào định dạng tệp nhị phân thường không để lại ảnh hưởng đến hệ thống được giám sát.

Nhưng tôi khuyên bạn không nên sử dụng Perfmon (như trong perfmon.exe). Thay vì làm quen với logman.exe, hãy xem Mô tả về Logman.exe, Relog.exe và Công cụ typeperf.exe . Bằng cách này, bạn không buộc phiên thu thập vào phiên của mình. Logman, là một công cụ dòng lệnh, có thể được sử dụng trong các tập lệnh và công việc được lên lịch để bắt đầu và dừng các phiên thu thập.


Tôi đang sử dụng TypePerf.exe với DSN để chèn dữ liệu trực tiếp vào các bảng. Có một db riêng cho họ. Nó sẽ ảnh hưởng theo cách nào?
UdIt Solanki

14

Không có gì sai khi chạy perfmon trên các hộp sản xuất. Đó là khóa tương đối thấp và có thể thu thập rất nhiều thông tin tốt cho bạn. Và làm thế nào bạn mô phỏng chính xác tải sản xuất nếu bạn không chạy một số phân tích trên máy chủ sản xuất? Từ Brent Ozar trong liên kết của riêng bạn:

Hãy để Perfmon chạy trong một hoặc hai ngày để thu thập một đường cơ sở tốt cho hoạt động của máy chủ. Nó không xâm lấn vào Máy chủ SQL đang được theo dõi và kết quả chuyên sâu sẽ được đền đáp. Chúng ta càng có nhiều dữ liệu, chúng ta càng có thể làm tốt hơn việc phân tích kết quả Perfmon.

Tôi đã chạy perfmon trên một số hộp Exchange sản xuất mà không có tác dụng phụ.


5
Đồng ý - không có chi phí hoạt động từ Perfmon. Một câu trả lời khác đề nghị chạy Profiler thay vì Perfmon, nhưng có một chi phí rất thực tế để chạy Profiler. Tôi đã thấy các dấu vết của Profiler làm giảm các máy chủ sản xuất khi hộp theo dõi không thể theo kịp tải hoặc khi tải được thêm vào đã đẩy máy chủ sản xuất vượt ra ngoài lề.
Brent Ozar

Cảm ơn cho chiming trong @Brent. Nhân tiện, tôi đã mua cuốn sách nội bộ năm 2008 của bạn ngày hôm qua.
Bill Paetzke

À, tuyệt! Hãy cho tôi biết bạn nghĩ gì về nó.
Brent Ozar

7

Kể từ khi tôi nghe Clint Huffman , người đã viết PAL một tiện ích để phân tích Nhật ký Perfmon, trên một podcast. Tôi đã thiết lập cái mà tôi gọi là Trình ghi chuyến bay trên tất cả các máy chủ ứng dụng sản xuất của chúng tôi. Thực hành này đã rất hữu ích để chẩn đoán các vấn đề và xu hướng theo dõi.

Dưới đây là tập lệnh tôi sử dụng để thiết lập Trình thu thập Perfmon tự động khởi động, với tính năng xóa nhật ký. Nếu muốn, nó có thể được cung cấp một bộ đếm hiệu suất liệt kê tệp để thu thập (một trên mỗi dòng) hoặc tệp XML Ngưỡng PAL. Tôi thích sử dụng các tập tin Ngưỡng PAL.

<#
Install-FlightRecorder.ps1
.SYNOPSIS
Installs or sets up the pieces necessary to create PerfMon Collector 
snapshots, one a minute, to a file located in C:\FlightRecorder.

.DESCRIPTION
Installs or sets up the pieces necessary to create PerfMon Collector 
snapshots, one a minute, to a file located in C:\FlightRecorder.

.PARAMETER Path
File listing performance counters to collect, one per line. 
Or a PAL Threshold XML file.

#>
[CmdletBinding()]
param (
    [string]$Path
)

#Requires -RunAsAdministrator
$ScriptDir = { Split-Path $MyInvocation.ScriptName –Parent }
$DeleteTempFile = $False

function Main {
    if (-not $Path) { $Path = DefaultFile $Path }
    if (-not (Test-Path $Path)) {
        Write-Warning "Path does not exist or is inaccessable: $Path"
        Exit 1
    }
    if ($Path -like '*.xml') { $Path = PALFile $Path }

    Install-FlightRecorder
    if ($Path.startswith($env:TEMP)) {Remove-Item $Path}
    Write-Verbose 'Installation Successful.'
}

function Install-FlightRecorder {
    Write-Verbose 'Setting up the Flight Recorder.'
    if (-not (Test-Path c:\FlightRecorder\)) {
        mkdir c:\FlightRecorder | out-null 
    }
    if ((LOGMAN query) -match 'FlightRecorder') {
        Write-Verbose 'Removing former FlightRecorder PerfMon Collector.'
        LOGMAN stop FlightRecorder | out-null
        LOGMAN delete FlightRecorder | Write-Verbose
    }
    Write-Verbose 'Creating FlightRecorder PerfMon Collector.'
    LOGMAN create counter FlightRecorder -o "C:\FlightRecorder\FlightRecorder_$env:computername" -cf $Path -v mmddhhmm -si 00:01:00 -f bin | Write-Verbose
    SCHTASKS /Create /TN FlightRecorder-Nightly /F /SC DAILY /ST 00:00 /RU SYSTEM /TR 'powershell.exe -command LOGMAN stop FlightRecorder; LOGMAN start FlightRecorder; dir c:\FlightRecorder\*.blg |?{ $_.LastWriteTime -lt (Get-Date).AddDays(-3)} | del' | Write-Verbose
    SCHTASKS /Create /TN FlightRecorder-Startup /F /SC ONSTART /RU SYSTEM /TR "LOGMAN start FlightRecorder" | Write-Verbose
    SCHTASKS /Run /TN FlightRecorder-Startup | Write-Verbose
}

function DefaultFile {
    Write-Warning 'Counter or PAL file not specified, using default configuration.'
    $DeleteTempFile = $True
    $Path = [System.IO.Path]::GetTempFileName()
    Set-Content -Encoding ASCII $Path @'
\LogicalDisk(*)\Avg. Disk sec/Read
\LogicalDisk(*)\Avg. Disk sec/Write
\LogicalDisk(*)\Disk Transfers/sec
\LogicalDisk(C:)\Free Megabytes
\Memory\% Committed Bytes In Use
\Memory\Available MBytes
\Memory\Committed Bytes
\Memory\Free System Page Table Entries
\Memory\Pages Input/sec
\Memory\Pages/sec
\Memory\Pool Nonpaged Bytes
\Memory\Pool Paged Bytes
\Memory\System Cache Resident Bytes
\Network Interface(*)\Bytes Total/sec
\Network Interface(*)\Output Queue Length
\Paging File(*)\% Usage
\Paging File(*)\% Usage Peak
\PhysicalDisk(*)\Avg. Disk sec/Read
\PhysicalDisk(*)\Avg. Disk sec/Write
\Process(_Total)\Handle Count
\Process(_Total)\Private Bytes
\Process(_Total)\Thread Count
\Process(_Total)\Working Set
\Processor(*)\% Interrupt Time
\Processor(*)\% Privileged Time
\Processor(*)\% Processor Time
\System\Context Switches/sec
\System\Processor Queue Length
'@
    $Path
}

function PalFile {
    $DeleteTempFile = $True
    $InputPath = $Path
    $Path = [System.IO.Path]::GetTempFileName()
    $filesRead = @()
    Read-PalFile $InputPath | Select -Unique | sort | Set-Content -Encoding ASCII $Path
    $Path
}

$script:filesRead =@()
function Read-PalFile ([string]$path) {
    if (-not (Test-Path $path)) {
        Write-Warning "PAL Threshold file not found: $path"
        return
    }
    if ($script:filesRead -contains $path) {return}
    $script:filesRead += @($path)
    Write-Verbose "Reading PAL Threshold file: $path"
    $xml = [XML](Get-Content $path)
    $xml.SelectNodes('//DATASOURCE[@TYPE="CounterLog"]') | select -expand EXPRESSIONPATH
    $xml.SelectNodes('//INHERITANCE/@FILEPATH') | select -expand '#text' | where {$_ } | ForEach {
        $newpath = Join-Path (Split-Path -parent $path) $_
        Write-Debug "Inheritance file: $newpath"
        Read-PalFile $newpath
    }
}

. Main

Tập lệnh này có cần cài đặt gì không (PAL hoặc bất cứ thứ gì khác)? Bạn có thể vui lòng cung cấp một mẫu của tập tin đầu ra mà nó tạo ra nếu có thể? Xin lỗi tôi không biết PowerShell.
CodingYoshi

Không có gì để cài đặt. Kịch bản này cấu hình các tính năng Windows gốc. Nó tạo ra một bộ sưu tập PerMon, cộng với hai tác vụ theo lịch trình. Một tác vụ, khởi động trình thu thập PerfMon sau khi khởi động lại. Các nhiệm vụ khác, làm sạch các tập tin nhật ký cũ. Nếu bạn muốn phân tích các tệp PerfMon của mình với PAL, tôi khuyên bạn nên thiết lập PAL và chạy trên một máy chủ không sản xuất. Để dễ dàng thiết lập, điều này sẽ đọc một tệp cấu hình PAL.
Nathan Hartley

3

Chúng tôi làm điều đó khá thường xuyên. Nó cũng rất cần thiết để thiết lập đường cơ sở trong môi trường thực, vì vậy bạn có thể so sánh sau nếu có vấn đề hoặc bạn cần thực hiện nghiên cứu năng lực.

Tôi khuyên bạn không nên đi dưới một khoảng thời gian 10 giây. Nếu bạn đang thu thập nhiều đối tượng / bộ đếm và khoảng thời gian quá thường xuyên, nó có thể ảnh hưởng đến hoạt động.

Microsoft có một Wizard Wizard PerfMon sẽ thiết lập nhiệm vụ cho bạn.

http://www.microsoft.com/doads/details.aspx?FamilyID=31FCCD98-C3A1-4644-9622-FAA046D69214&displaylang=en


Tôi thấy rằng Trình hướng dẫn PerfMon đã được phát hành vào năm 2004. Tôi tự hỏi liệu nó có chuẩn với SQL Server 2005.
Bill Paetzke

Tôi nghĩ rằng phiên bản đó vẫn còn hiện hành.
Greg Askew

2

Trong một thế giới lý tưởng nơi một máy chủ sản xuất phản ánh chính xác những gì một máy chủ dev, thực hiện và cũng là một bản sao chính xác của máy chủ dev, không bao giờ nên yêu cầu perfmon trên máy chủ sản xuất vì kết quả sẽ giống như trên máy chủ dev. Tất nhiên tình huống hoang đường đó không bao giờ xảy ra, vì vậy chúng tôi cần phải chạy perfmon trên các máy chủ sản xuất và hoàn toàn không có gì sai với điều đó. Trong số những thứ khác, chúng ta có thể cần sử dụng perfmon và các công cụ khác để tìm hiểu lý do tại sao máy chủ sản xuất không hoạt động giống như máy chủ dev.


2

Tại sao nước hoa? Ý tôi là, các phiên bản gần đây của máy chủ SQL có phương pháp riêng để thực hiện việc đó bao gồm xây dựng kho dữ liệu (trung tâm) của các bộ đếm hiệu suất mà sau đó có thể được truy vấn và báo cáo. Không có ý nghĩa trong việc chạy perfmon ở đó.

Tôi, như mọi khi, ngạc nhiên bởi tất cả các bài viết ở đây của những người rõ ràng không bao giờ đọc tài liệu;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ là một khởi đầu tốt. IMHO nên hoạt động trên hầu hết các máy chủ sql được sử dụng cho mục đích sản xuất.


1

Không có gì sai khi chạy Perfmon như nhiều người đã đề xuất, nhưng tôi sẽ chạy Profiler thay vào đó hoặc ngoài ra, với cùng một cảnh báo, đừng nắm bắt quá thường xuyên, chỉ cần nắm bắt các truy vấn chạy dài, tức là thời lượng> x giây hoặc cpu> xx hoặc đọc> xxxx; rất ít tác động và bạn sẽ nhanh chóng thấy các truy vấn sẽ có lợi nhất từ ​​việc điều chỉnh.


Bạn sử dụng gì làm ngưỡng cơ bản của thời lượng, cpu và đọc?
Bill Paetzke

Nó phụ thuộc vào ứng dụng, nhưng tôi sẽ bắt đầu với thời lượng> (thời gian tối đa tôi muốn bất kỳ người dùng nào chờ đợi bất cứ điều gì); bắt đầu quá cao, 10 giây trở lên, nếu bạn không nhận được gì, thật tuyệt, hãy lùi lại một chút. Đảm bảo bạn sẽ có một số "bất ngờ" nổi lên hàng đầu.
SqlACID

..và tôi sẽ bắt đầu với thời lượng, chỉ sử dụng CPU nếu bạn nghĩ rằng bạn bị ràng buộc CPU, đọc hoặc ghi bộ đếm nếu bạn bị ràng buộc I / O, nhưng sử dụng thời lượng nếu bạn không chắc chắn nút thắt nằm ở đâu, hoặc chỉ , như bạn đã nói, cố gắng cảm nhận những gì đang diễn ra.
SqlACID
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.