QNX 儀表化微內核

QNX 儀表化微內核

  微內核的儀表化版本(procnt -instr)配備了複雜的跟蹤和分析機制,允許您實時監視系統的執行。procnt -instr模塊可以在單cpu和SMP系統上工作。
  procnt -instr模塊使用的開銷非常少,並且具有非常好的性能——它的速度通常是非儀表化內核(在不記錄日誌的情況下)速度的98%左右。與這個有用工具所增加的功能和靈活性相比,儀表化內核中額外的代碼量(x86系統上大約30 KB)是一個相對較小的代價。根據最終系統的內存需求,您可以選擇使用這個特殊的內核作爲開發/原型工具,或者作爲最終產品中的實際內核。
  儀表化的模塊是非侵入性的——您不必修改程序的源代碼來監視程序如何與內核交互。您可以根據需要跟蹤內核與系統中任何正在運行的線程或進程之間的交互(例如,內核調用、狀態更改和其他系統活動)的數量或數量。您甚至可以監視中斷。在這種情況下,所有這些活動都稱爲事件。
有關詳細信息,請參閱系統分析工具包用戶指南。(System Analysis Toolkit User’s Guide)

儀表化一瞥

  以下是內核儀表化中涉及的基本任務:

  1. 插裝的微內核(procnt -instr)會發出跟蹤事件,跟蹤各種系統活動。這些事件被自動複製到一組緩衝區中,這些緩衝區被分組到一個循環鏈表中。
  2. 一旦緩衝區中的事件數量達到高水位,內核就通知一個數據捕獲實用程序。
  3. 然後,數據捕獲實用程序將跟蹤事件從緩衝區寫到輸出設備(例如,串口、事件文件等)。
  4. 然後,數據解釋工具解釋事件並將這些數據呈現給用戶。
    Figures0

事件控制

  考慮到活動系統中發生的大量活動,內核發出的事件數量可能會非常多(就數據量、處理需求和存儲所需的資源而言)。但是您可以輕鬆地控制發出的數據量。具體地說,您可以:

  1. 控制觸發事件發出的初始條件。
  2. 應用預定義的內核過濾器來動態控制發出。
  3. 實現您自己的事件處理程序來進行更多的過濾。
      一旦數據捕獲實用程序(tracelogger)收集了數據,就可以對其進行分析。您可以實時分析數據,也可以在收集相關事件後離線分析數據。IDE中的系統分析工具以圖形方式顯示這些數據,這樣您就可以“看到”系統中正在發生的事情。

發射模式

  除了應用各種過濾器來控制事件流,你還可以指定內核可以用來發射事件的兩種模式之一:

  1. fast mode: 只發出關於事件的最相關的信息(例如,只有兩個內核調用參數)。
  2. wide mode: 爲同一事件生成更多信息(例如,所有內核調用參數)。

  這裏的權衡是速度與信息的權衡:快速模式提供的數據更少,而寬模式爲每個事件打包的信息更多。不管採用哪種方式,您都可以輕鬆地調優系統,因爲這些模式是基於每個事件的。
  作爲fast和wide發射模式區別的一個例子,讓我們看看我們可能會看到的MsgSendv()調用條目的信息:

Fast mode data Number of bytes for the event
Connection ID 4 bytes
Message data 4 bytes (the first 4 bytes usually comprise the header)
total data Total emitted: 8 bytes
Wide mode data Number of bytes for event
Connection ID 4 bytes
# of parts to send 4 bytes
# of parts to receive 4 bytes
Message data 4 bytes (the first 4 bytes usually comprise the header)
Message data 4 bytes
Message data 4 bytes
tatal data 24 bytes

環形緩衝區

  內核可以將所有跟蹤事件保存在內部循環緩衝區中,而不是總是將事件發送到外部設備。當滿足某個觸發條件時,可以通過編程方式將該緩衝區轉儲到外部設備,這使得它成爲一個非常強大的工具,可以用來識別在某些運行時條件下突然出現的難以捉摸的bug。

數據解析

  事件的數據包括一個高精度的時間戳,以及生成事件的CPU的ID號。這些信息有助於您輕鬆診斷困難的定時問題,這些問題更有可能發生在多處理器系統上。
  事件格式還包括CPU平臺(如x86、ARM等)和endian類型,便於遠程分析(實時或離線)。使用數據解釋器,您可以查看數據輸出的各種方式,如:

  • 基於時間戳的整個系統的線性表示。
  • 只有活動線程/進程的“正在運行”視圖。
  • 每個進程/線程的基於狀態的事件視圖。
    數據解釋器的線性輸出可能是這樣的:
TRACEPRINTER version 0.94
-- HEADER FILE INFORMATION --
TRACE_FILE_NAME:: /dev/shmem/tracebuffer
TRACE_DATE:: Fri Jun 8 13:14:40 2001
TRACE_VER_MAJOR:: 0
TRACE_VER_MINOR:: 96
TRACE_LITTLE_ENDIAN:: TRUE
TRACE_ENCODING:: 16 byte events
TRACE_BOOT_DATE:: Fri Jun 8 04:31:05 2001
TRACE_CYCLES_PER_SEC:: 400181900
TRACE_CPU_NUM:: 4
TRACE_SYSNAME:: QNX
TRACE_NODENAME:: x86quad.gp.qa
TRACE_SYS_RELEASE:: 6.1.0
TRACE_SYS_VERSION:: 2001/06/04-14:07:56
TRACE_MACHINE:: x86pc
TRACE_SYSPAGE_LEN:: 2440
-- KERNEL EVENTS --
t:0x1310da15 CPU:01 CONTROL :TIME msb:0x0000000f, lsb(offset):0x1310d81c
t:0x1310e89d CPU:01 PROCESS :PROCCREATE_NAME
ppid:0
pid:1
name:./procnto-smp-instr
t:0x1310eee4 CPU:00 THREAD :THCREATE pid:1 tid:1
t:0x1310f052 CPU:00 THREAD :THRUNNING pid:1 tid:1
t:0x1310f144 CPU:01 THREAD :THCREATE pid:1 tid:2
t:0x1310f201 CPU:01 THREAD :THREADY pid:1 tid:2
t:0x1310f32f CPU:02 THREAD :THCREATE pid:1 tid:3
t:0x1310f3ec CPU:02 THREAD :THREADY pid:1 tid:3
t:0x1310f52d CPU:03 THREAD :THCREATE pid:1 tid:4
t:0x1310f5ea CPU:03 THREAD :THRUNNING pid:1 tid:4
t:0x1310f731 CPU:02 THREAD :THCREATE pid:1 tid:5
.
.

  爲了幫助您調整對事件數據流的解釋,我們提供了一個庫(traceparser),這樣您就可以編寫自己的自定義事件解釋器。

使用IDE進行系統分析

  系統分析工具包(SAT)的IDE模塊可以作爲一個綜合的儀表控制和後處理可視化工具。在IDE中,開發人員可以配置所有跟蹤事件和模式,然後將日誌文件自動傳輸到遠程系統進行分析。作爲一種可視化工具,IDE提供了一組豐富的事件和流程篩選器,旨在幫助開發人員快速刪除大量事件集,以便只查看感興趣的事件。
FIgure31

主動跟蹤

  雖然儀表化的內核爲儀表化和監視進程、線程和系統狀態提供了一種優秀的不引人注目的方法,但是您也可以讓您的應用程序主動地影響事件收集過程。通過使用TraceEvent()庫調用,應用程序本身可以將定製事件注入跟蹤流。這個功能在構建大型、緊密耦合的多組件系統時特別有用。
  例如,下面的簡單調用將把eventcode,first和second的整數值注入到事件流中:

TraceEvent(_NTO_TRACE_INSERTSUSEREVENT, eventcode, first, second);

你也可以在事件流中注入一個字符串(例如“我的事件”),如下面的代碼所示:

#include <stdio.h>
#include <sys/trace.h>
/* Code to associate with emitted events */
#define MYEVENTCODE 12
int main(int argc, char **argv) {
    printf("My pid is %d \n", getpid());
    /* Inject two integer events (26, 1975) */
    TraceEvent(_NTO_TRACE_INSERTSUSEREVENT, MYEVENTCODE,
    26, 1975);
    /* Inject a string event (My Event) */
    TraceEvent(_NTO_TRACE_INSERTUSRSTREVENT, MYEVENTCODE,
    "My Event");
    return 0;
}

由traceprinter數據解釋器收集的輸出會是這樣的:
‘’’
.
.
t:0x38ea737e CPU:00 USREVENT:EVENT:12, d0:26 d1:1975
.
.
.
t:0x38ea7cb0 CPU:00 USREVENT:EVENT:12 STR:“My Event”
‘’’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章