6

Tôi đang làm việc để giám sát hiệu suất của dịch vụ Azure.Xác định quy trình w3wp được liên kết cho một cá thể vai trò web

Có hiện hai trường hợp vai trò web (ví cùng một trang web) chạy - mỗi với riêng W3WP.exe (w3wp và w3wp # 1)

Làm thế nào tôi có thể tìm ra quá trình w3wp thuộc mà vai trò dụ ?

Với thông tin này tôi muốn cho ăn azure.diagnostics.monitor với một số bộ đếm hiệu suất - cụ thể là Process (w3wp) \ ProcessorTime (%) và Thread Count. Nhưng để có được bất kỳ dữ liệu có ý nghĩa nào, tôi phải nối thêm ID quá trình của quy trình w3wp vào bộ đếm hiệu suất (ví dụ: Process (w3wp_PID) \ processorTime (%)) - không biết cú pháp có đúng hay không, nhưng có một cách để phụ thêm PID)

nên kết quả cuối cùng trong WADPerformanceCounters bảng AzureStorage chỉ có các mục như:

WebRoleInstance_n_0 | process(w3wp_1033)\processorTime (%) | 12.4 
WebRoleInstance_n_1 | process(w3wp_1055)\processorTime (%) | 48.4 

atm của nó như

WebRoleInstance_n_0 | process(w3wp)\processorTime (%) | 12.4 
WebRoleInstance_n_1 | process(w3wp)\processorTime (%) | 12.4 

tôi nghĩ: nếu tôi bắt đầu một DiagnosticsMonitor cho mỗi Vai trò, rằng màn hình sẽ sử dụng quy trình chỉnh sửa - thuộc về Roleinstance, người đã khởi động màn hình. nhưng thực ra điều đó không có tác dụng - hoặc tôi nghĩ nó không hoạt động - ít nhất là sau khi nhìn vào các giá trị kết quả.

// cập nhật: trên cổng quản lý.windowsazure, bạn có thể xác định số liệu tùy chỉnh để theo dõi hiệu suất. Có thể ở đây để chọn cá thể webrole được giám sát độc quyền. Đây là những gì tôi muốn làm. Thông tin chi tiết về những gì trang này thực sự có thể giúp ích.

để so sánh: http://puu.sh/1xp7q

Họ chỉ cách ngu ngốc tôi có thể nghĩ ra để có được thông tin này là: để có được một danh sách tất cả các quá trình trước và sau mỗi lần w3wp được bắt đầu - xác định cái nào đã được bổ sung và sau đó quyết định bối cảnh cơ bản mã khôn ngoan mà vai trò vai trò vừa mới bắt đầu.

Trả lời

0

tôi đã làm việc đó - mặc dù nó không thực sự thẳng về phía trước.

trước hết tôi phải thực hiện một số chỉnh sửa cho các báo cáo trước đây của tôi - chỉ để ở cùng cấp.

Trong Dịch vụ đám mây có một số Máy ảo, mỗi máy chủ lưu trữ hoặc một WebRole Instance hoặc một WorkerRole Instance. Vì vậy, trên một máy ảo duy nhất chỉ có một w3wp duy nhất chạy hoặc không có w3wp ở tất cả, nhưng một quá trình waworkerhost.

Trong trường hợp đặc biệt của tôi, có khả năng có hai w3wp chạy trên một máy ảo duy nhất. vì vậy tôi cần phải phân biệt giữa hai lý do đó - do đó yêu cầu tôi thực hiện một số loại liên kết quá trình thể hiện.

Điều tôi muốn ghi là: Tổng tải CPU của một máy ảo duy nhất, tải CPU của quá trình diễn tiến chạy trên máy ảo (w3wp, waworkerhost).

PerformanceCounter cho Tổng tải CPU là dễ dàng và bình đẳng cho mỗi máy ảo: \ Processor (_Total) \% Processortime cho máy ảo webr i không thể sử dụng bộ xử lý \ process (w3wp) \% processortime vì tôi không thể chắc chắn nếu nó chính xác w3wp (xem ở trên)

Bây giờ ở đây là những gì tôi đã làm: Vì bạn phải bắt đầu một màn hình truy cập hiệu suất cho mỗi vai trò vai trò OnStart() trong WebRole.cs hoặc WorkerRole.cs tôi figured this là nơi duy nhất mà tôi có thể thu thập thông tin cần thiết bằng cách nào đó.

Trong WorkerRole.cs tôi đã làm:

int pc = Environment.ProcessorCount; 
     string instance = RoleEnvironment.CurrentRoleInstance.Id; 

     SomeOtherManagementClass.StartDiagnosticMonitorService(pc, instance, Process.GetCurrentProcess()); 

Trong WebRole.cs các CurrentProcess cũng trả WaWorkerHost, vì vậy tôi đã phải di chuyển codelines trên vào global.asax của WebRole. Ở đây Quy trình chính xác có sẵn.

Trong SomeOtherManagementClass tôi đặt StartDiagnosticsMonitorService, hiện nhận được CurrentProcess mà từ đó StartDiagnosticsMonitorService được gọi. (từ workerrole.cs nó sẽ nhận WaWorkerHost Quy trình và từ WebRoles quá trình w3wp - bao gồm PID)

public static void StartDiagnosticMonitorService(int coreCount, string currentRole, Process process) 
    { 
     string processName = GetProcessInstanceName(process.Id); 
     SetCPUCoreData(coreCount, currentRole, processName, process.Id); 
     ... 
    instanceProcessLoadCounterName = String.Format(@"\Process({0})\% Processor Time", processName); 
    } 

GetProcessInstanceName (process.Id) bây giờ được gọi là trên mỗi máy ảo và nhận được ProcessName đến process.Id cung cấp - Điều này cho phép bạn tạo sự khác biệt giữa nhiều w3wps trên một máy ảo duy nhất vì instanceNames được trả về là w3wp, w3wp # 1, w3wp # 2 vv. ngược lại với processName được cung cấp bởi GetCurrentProcess, đó là allways w3wp. i này sửa đổi một codesample tôi tìm thấy ở đây trên stackoverflow - bạn có thể tìm thấy nó dưới đây:

private static string GetProcessInstanceName(int pid) 
    { 
     PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); 

     string[] instances = cat.GetInstanceNames(); 
     foreach (string instance in instances) 
     { 
      try 
      { 
       using (PerformanceCounter cnt = new PerformanceCounter("Process", 
       "ID Process", instance, true)) 
       { 
        int val = (int)cnt.RawValue; 
        if (val == pid) 
        { 
         return instance; 
        } 
       } 
      } 
      catch (InvalidOperationException) 
      { 
       //this point is reached when a process terminates while iterating the processlist- this it cannot be found 
      } 
     } 
     return ""; 
    } 

Cuối cùng nhưng không kém phần quan: SetCPUCoreData (coreCount, currentRole, ProcessName, process.Id) lưu tất cả dữ liệu liên quan của các quá trình để lưu trữ xanh nên nó có sẵn ở khắp mọi nơi từ trong ứng dụng:

private static void SetCPUCoreData(int count, string roleinstance, string processName, int processID) 
    { 
     string[] instances = roleinstance.Split('.'); 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(GetSettingValue("LoadMonitor.Connection.String")); 
     CloudTableClient cloudTableClient = storageAccount.CreateCloudTableClient(); 
     const string tableName = "PerformanceMonitorCoreCount"; 
     cloudTableClient.CreateTableIfNotExist(tableName); 
     TableServiceContext serviceContext = cloudTableClient.GetDataServiceContext(); 


     PerformanceCounterCPUCoreEntity ent = new PerformanceCounterCPUCoreEntity(count, instances[instances.Count() - 1],processName, processID); 
     serviceContext.AttachTo(tableName, ent); 
     serviceContext.UpdateObject(ent); 
     serviceContext.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); 
    } 

các PerformanceCounterCPUCoreEntity là một Template cho StorageTable - nhìn vào API lưu trữ xanh nếu bạn có bất cứ thắc mắc gì về phần này, hoặc chỉ cần hỏi.

Các vấn đề liên quan