亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2318 | 回復(fù): 0
打印 上一主題 下一主題

使用 AIX Event Infrastructure 監(jiān)視事件 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-01-17 17:05 |只看該作者 |倒序?yàn)g覽
簡介
AIX Event Infrastructure 是一個(gè)用于監(jiān)視預(yù)定義和用戶定義的系統(tǒng)事件的事件監(jiān)視框架。在 AIX Event Infrastructure 的上下文中,事件是指狀態(tài)或值的變化,變化發(fā)生時(shí),可以在內(nèi)核或內(nèi)核擴(kuò)展中探測到它們。
可以監(jiān)視到的每個(gè)事件類型都與一個(gè)事件生成器相關(guān)聯(lián)。事件生成器只是在事件發(fā)生時(shí)探測事件并通知 AIX Event Infrastructure 的代碼段。下面例舉了一些可用的事件生成器:
  • modFile:modFile 事件生成器監(jiān)視對文件內(nèi)容的修改。
  • utilFs:utilFs 事件生成器監(jiān)視文件系統(tǒng)利用率。
  • waitTmPgInOut:waitTmPgInOut 事件生成器監(jiān)視線程在一秒內(nèi)等待頁面換入或換出操作完成的平均等待時(shí)間(以毫秒為單位)。
事件表示為一個(gè)偽文件系統(tǒng)中的文件。使用現(xiàn)有的文件系統(tǒng)接口(read()、write()、select() 等)指定應(yīng)該如何和何時(shí)通知監(jiān)視應(yīng)用程序(也稱為消費(fèi)者),以及等待和讀取事件的相關(guān)數(shù)據(jù)。使用 AIX Event Infrastructure 中監(jiān)視器文件的路徑名決定消費(fèi)者希望監(jiān)視哪些事件。

圖 1. 掛裝的 AIX Event Infrastructure 文件系統(tǒng)的實(shí)例示例

在 AIX Event Infrastructure 文件系統(tǒng)中,有四種基本文件類型:
  • 監(jiān)視器工廠:監(jiān)視器工廠是擴(kuò)展名為 ".monFactory" 的目錄。它們以目錄的形式表示事件生成器。在掛載 AIX Event Infrastructure 文件系統(tǒng)時(shí)自動地創(chuàng)建這些目錄。
  • 監(jiān)視器文件:監(jiān)視器文件的擴(kuò)展名是 ".mon",它們代表要監(jiān)視的事件。它們只出現(xiàn)在代表相關(guān)聯(lián)的事件生成器的監(jiān)視器工廠下面。
  • 列表文件:列表文件是特殊的數(shù)據(jù)文件,擴(kuò)展名是 ".list"。當(dāng)前只有一個(gè)列表文件,即 evProds.list。讀取這個(gè)文件會返回所有可用事件生成器的列表。
  • 子目錄:子目錄用于簡化管理,它們代表事件的完整路徑名。

用 AIX Event Infrastructure 監(jiān)視事件
AIX Event Infrastructure 包含在 AIX 6.1 TL 6 和 AIX 7.1 上的 bos.ahafs 文件集中。要想監(jiān)視事件,首先要安裝 bos.ahafs 文件集并掛載 AIX Event Infrastructure 文件系統(tǒng)的實(shí)例:
        mkdir /aha        mount -v ahafs /aha /aha

可以把這個(gè)文件系統(tǒng)載在想要的任何掛裝點(diǎn)上。本文中的示例假設(shè)它掛裝在 /aha。
決定要使用哪個(gè)監(jiān)視器文件
掛裝文件系統(tǒng)之后,必須判斷與希望監(jiān)視的事件對應(yīng)的監(jiān)視器文件的路徑名。對于每個(gè)事件生成器,以不同的方法決定應(yīng)該使用的路徑名。
在下一節(jié)研究的監(jiān)視示例中,我們要監(jiān)視對 /etc/passwd 文件的修改。為了判斷監(jiān)視器文件的路徑名,需要判斷與這個(gè)事件對應(yīng)的事件生成器。因?yàn)?/etc/passwd 是常規(guī)文件,所以應(yīng)該使用 modFile 事件生成器監(jiān)視對其內(nèi)容的修改。根據(jù) modFile 文檔,“應(yīng)該在 modFile.monFactory 目錄下面創(chuàng)建路徑與希望監(jiān)視的文件相同的監(jiān)視器文件! 因此,假設(shè) AIX Event Infrastructure 文件系統(tǒng)掛裝在 /aha,這個(gè)監(jiān)視器文件的完整路徑名應(yīng)該是:/aha/fs/modFile.monFactory/etc/passwd.mon。
應(yīng)該注意,監(jiān)視器文件的路徑名以相關(guān)聯(lián)的監(jiān)視器工廠的路徑開頭,代表不同的事件。例如,/aha/fs/modDir.monFactory/home/cherylfs.mon 文件監(jiān)視 /home/cherylfs 目錄中的文件創(chuàng)建和刪除。/aha/fs/utilFs.monFactory/home/cherylfs.mon 文件監(jiān)視 /home/cherylfs 文件系統(tǒng)的利用率。
事件監(jiān)視流程示例
下面是典型事件監(jiān)視流程的高層視圖。在這個(gè)示例中,事件消費(fèi)者(監(jiān)視應(yīng)用程序)監(jiān)視 /etc/passwd 文件。這個(gè)流程說明在監(jiān)視事件時(shí)事件消費(fèi)者和 AIX Event Infrastructure 執(zhí)行的操作。

圖 2. 事件監(jiān)視流程示例

此時(shí),監(jiān)視應(yīng)用程序休眠,直到探測到事件發(fā)生。AIX Event Infrastructure 監(jiān)視文件操作,判斷所監(jiān)視的文件是否被修改。

圖 3. 事件監(jiān)視流程示例(續(xù))

在前面的示例中可以看到,監(jiān)視應(yīng)用程序的典型流程是:
  • 使用 write() 系統(tǒng)調(diào)用設(shè)置事件監(jiān)視。
  • 使用 select()(或阻塞的 read())系統(tǒng)調(diào)用等待事件發(fā)生。
  • 通過 read() 系統(tǒng)調(diào)用讀取事件發(fā)生數(shù)據(jù)。
  • 解析事件發(fā)生數(shù)據(jù)并采取適當(dāng)?shù)拇胧?li>如果需要,繼續(xù)等待事件發(fā)生。
本文會討論每個(gè)步驟。您可以下載本文提供的示例程序 mon_modFile_event.c。

設(shè)置事件監(jiān)視
掛載 AIX Event Infrastructure 文件系統(tǒng)并確定適當(dāng)?shù)谋O(jiān)視器文件之后,必須創(chuàng)建監(jiān)視器文件。這可以使用帶 O_CREAT 標(biāo)志的 open() 調(diào)用來完成。
創(chuàng)建并打開監(jiān)視器文件之后,必須寫入關(guān)于如何和何時(shí)發(fā)出通知的說明。
盡管大多數(shù)監(jiān)視說明很簡單,但是 AIX Event Infrastructure 以兩種方式處理通知計(jì)數(shù) (NOTIFY_CNT) 說明:

圖 4. NOTIFY_CNT 差別

對于 NOTIFY_CNT=-1 的情況,在監(jiān)視應(yīng)用程序當(dāng)前沒有在 select() 或 read() 調(diào)用中阻塞時(shí),如果探測到另一次事件發(fā)生,那么在分配給這個(gè)消費(fèi)者的緩沖區(qū)中記錄事件發(fā)生數(shù)據(jù)。當(dāng)監(jiān)視應(yīng)用程序試圖執(zhí)行另一次 select() 或阻塞的 read() 調(diào)用時(shí),這些調(diào)用會立即返回,因?yàn)榫彌_區(qū)中有未讀的事件發(fā)生數(shù)據(jù)。
在示例程序 mon_modFile_event.c 中,用戶通過參數(shù)傳遞要通過 modFile 事件生成器監(jiān)視的文件。如果需要,在 AIX Event Infrastructure 文件系統(tǒng)中創(chuàng)建子目錄以創(chuàng)建所需的監(jiān)視器文件。
打開監(jiān)視器文件之后,把字符串 "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=1" 寫入監(jiān)視器文件,這是因?yàn)椋?/div>
  • modFile 事件生成器指定了 AHAFS_THRESHOLD_STATE 功能 (CHANGED=YES)。
  • mon_modFile_event 程序?qū)⒃?select() 調(diào)用中等待 (WAIT_TYPE=WAIT_IN_SELECT)。
  • modFile 事件生成器不傳遞消息,而且這個(gè)程序中不需要堆棧跟蹤 (INFO_LVL=1)。
mon_modFile_event 程序會不斷地監(jiān)視事件。因?yàn)?NOTIFY_CNT 的默認(rèn)值是 -1,所以不需要指定它。

等待事件發(fā)生
監(jiān)視應(yīng)用程序可以監(jiān)視多個(gè)事件,多個(gè)應(yīng)用程序可以用不同的監(jiān)視說明監(jiān)視同一事件。
一定要注意,直到監(jiān)視應(yīng)用程序執(zhí)行 select() 或阻塞的 read() 調(diào)用,才會開始監(jiān)視事件。幾種情況會導(dǎo)致 select() 或阻塞的 read() 返回。AIX 6.1 信息中心中列出了這些情況。
把監(jiān)視說明寫入監(jiān)視器文件之后,示例程序在 select() 調(diào)用中阻塞。如果 select() 調(diào)用返回錯(cuò)誤,就把一個(gè)特殊的標(biāo)志傳遞給解析函數(shù),表示在輸出中將使用錯(cuò)誤格式。
不可用事件發(fā)生
對于某些事件生成器,可能有某些類型的事件發(fā)生會導(dǎo)致所監(jiān)視的事件變得無效。例如:
  • 通過 utilFs 事件生成器監(jiān)視的文件系統(tǒng)被卸載。
  • 通過 modFile 事件生成器監(jiān)視的文件被刪除或重命名。
  • 通過 processMon 或 pidProcessMon 事件生成器監(jiān)視的進(jìn)程死亡了。
出現(xiàn)不可用事件發(fā)生(unavailable event occurrence)之后,用戶無法監(jiān)視此事件,直到它再次可用。理想情況下,監(jiān)視應(yīng)用程序應(yīng)該識別不可用事件發(fā)生并采取糾正措施。這會讓事件再次有效。每個(gè)事件生成器的文檔列出了表示探測到不可用事件發(fā)生的返回碼。事件生成器的返回碼在 sys/ahafs_evProds.h 中定義。
對于本地的不可用事件發(fā)生,會刪除與此事件相關(guān)聯(lián)的監(jiān)視器文件。在監(jiān)視器文件的文件描述符仍然打開的情況下,監(jiān)視應(yīng)用程序可以從刪除的監(jiān)視器文件讀取事件數(shù)據(jù),但是不再繼續(xù)等待事件發(fā)生。當(dāng)監(jiān)視應(yīng)用程序采取糾正措施,事件再次有效之后,必須執(zhí)行以下操作恢復(fù)監(jiān)視:
  • 必須關(guān)閉刪除的監(jiān)視器文件的文件描述符。
  • 必須用 O_CREAT 標(biāo)志再次打開監(jiān)視器文件。
  • 必須把監(jiān)視說明寫入此文件。
此時(shí),監(jiān)視應(yīng)用程序再次在 select() 或 read() 中等待事件發(fā)生。
示例程序會檢查事件生成器的返回碼 (RC_FROM_EVPROD),判斷事件發(fā)生是否是不可用事件發(fā)生。對于某些不可用事件發(fā)生類型,它嘗試執(zhí)行糾正措施;對于其他類型,停止監(jiān)視。

讀取事件發(fā)生數(shù)據(jù)
事件數(shù)據(jù)由 <keyword>=<value> 對組成,收集的數(shù)據(jù)取決于事件生成器的功能和監(jiān)視應(yīng)用程序指定的 INFO_LVL。事件生成器的文檔列出了每個(gè)事件生成器的功能。
事件數(shù)據(jù)只能讀取一次,而且在一個(gè) read 調(diào)用中不會返回多個(gè)事件的數(shù)據(jù)。例如,假設(shè)在消費(fèi)者讀取監(jiān)視器文件之前,已經(jīng)把兩個(gè)事件發(fā)生的數(shù)據(jù)復(fù)制到了緩沖區(qū)中,每個(gè)事件發(fā)生的數(shù)據(jù)有 256 字節(jié)。即使消費(fèi)者調(diào)用 read() 以要求讀取 4096 字節(jié),也只會把第一個(gè)事件的 256 字節(jié)數(shù)據(jù)返回給用戶。需要再次執(zhí)行 read 調(diào)用,才能夠獲得第二個(gè)事件的數(shù)據(jù)。
在示例程序中,總是用 4K 的緩沖區(qū)讀取事件數(shù)據(jù)。這是推薦的讀取大小,因?yàn)榇蠖鄶?shù)事件發(fā)生數(shù)據(jù)都少于 4K。用這么大的緩沖區(qū)讀取數(shù)據(jù)意味著,不會由于傳遞給 read() 調(diào)用的緩沖區(qū)空間不夠造成只返回部分事件數(shù)據(jù)。
事件發(fā)生數(shù)據(jù)的示例
對于指定了 AHAFS_THRESHOLD_STATE 和 AHAFS_STKTRACE_AVAILABLE 并把消息傳遞給事件消費(fèi)者的事件生成器,三個(gè)級別的輸出如下所示:
INFO_LVL=1
INFO_LVL=2
INFO_LVL=3
BEGIN_EVENT_INFOTIME_tvsec=1269863383TIME_tvnsec=455993143SEQUENCE_NUM=0PID=6947038UID=0UID_LOGIN=0GID=0PROG_NAME=catRC_FROM_EVPROD=1000END_EVENT_INFO

BEGIN_EVENT_INFOTIME_tvsec=1269863383TIME_tvnsec=455993143SEQUENCE_NUM=0PID=6947038UID=0UID_LOGIN=0GID=0PROG_NAME=catRC_FROM_EVPROD=1000BEGIN_EVPROD_INFOevent producer message hereEND_EVPROD_INFOEND_EVENT_INFO

BEGIN_EVENT_INFOTIME_tvsec=1269863383TIME_tvnsec=455993143SEQUENCE_NUM=0PID=6947038UID=0UID_LOGIN=0GID=0PROG_NAME=catRC_FROM_EVPROD=1000BEGIN_EVPROD_INFOevent producer message hereEND_EVPROD_INFOSTACK_TRACE:ahafs_prod_callback+3C4ahafs_cbfn_wrapper+30ahafs_vn_write+204vnop_rdwr+7E4vno_rw+B4rwuio+12Crdwr+184kewrite+16C.svc_instrwrite+1A4_xwrite+6C_xflsbuf+B0__flsbuf+9Ccopyopt_ascii+2C0scat+388main+11C__start+68END_EVENT_INFO

對于指定了 AHAFS_THRESHOLD_VALUE_HI 但沒有指定 AHAFS_STKTRACE_AVAILABLE 并把消息傳遞給事件消費(fèi)者的事件生成器,三個(gè)級別的輸出如下所示:
INFO_LVL=1
INFO_LVL=2
INFO_LVL=3
BEGIN_EVENT_INFOTIME_tvsec=1269866715TIME_tvnsec=16678418SEQUENCE_NUM=0CURRENT_VALUE=3RC_FROM_EVPROD=1000END_EVENT_INFO

BEGIN_EVENT_INFOTIME_tvsec=1269866715TIME_tvnsec=16678418SEQUENCE_NUM=0CURRENT_VALUE=3RC_FROM_EVPROD=1000BEGIN_EVPROD_INFOevent producer message hereEND_EVPROD_INFOEND_EVENT_INFO

BEGIN_EVENT_INFOTIME_tvsec=1269866715TIME_tvnsec=16678418SEQUENCE_NUM=0CURRENT_VALUE=3RC_FROM_EVPROD=1000BEGIN_EVPROD_INFOevent producer message hereEND_EVPROD_INFOEND_EVENT_INFO

如果事件生成器返回錯(cuò)誤,那么所有事件生成器對于所有 INFO_LVL 都使用以下格式:
        BEGIN_EVENT_INFO        TIME_tvsec=1269868036        TIME_tvnsec=966708948        SEQUENCE_NUM=0        RC_FROM_EVPROD=19        END_EVENT_INFO

如果消費(fèi)者監(jiān)視一個(gè)值事件,而當(dāng)前值已經(jīng)超過了要求的閾值,那么使用以下格式記錄這個(gè) EALREADY 事件:
        BEGIN_EVENT_INFO        TIME_tvsec=1281837726        TIME_tvnsec=446010404        SEQUENCE_NUM=0        CURRENT_VALUE=70        RC_FROM_EVPROD=56        END_EVENT_INFO

每個(gè)事件生成器提供關(guān)于它們生成的事件發(fā)生的輸出中包含什么內(nèi)容的信息。事件生成器的返回碼在 sys/ahafs_evProds.h 中定義。
示例程序在事件發(fā)生數(shù)據(jù)中檢查錯(cuò)誤格式,判斷 select() 調(diào)用是否返回了錯(cuò)誤。如果沒有返回錯(cuò)誤,就使用 modFile 事件生成器文檔中包含的格式。它使用 sscanf() 讀取相應(yīng)關(guān)鍵字的值。
SEQUENCE_NUM 關(guān)鍵字
對于每個(gè)消費(fèi)者,維護(hù)每個(gè)事件的序號。相同的事件發(fā)生對于不同的消費(fèi)者可能有不同的序號,這取決于消費(fèi)者開始監(jiān)視事件的時(shí)間。
出現(xiàn)監(jiān)視停止之后,序號復(fù)位為 0。下圖說明 SEQUENCE_NUM 關(guān)鍵字的表現(xiàn)。

圖 4. 兩個(gè)消費(fèi)者監(jiān)視同一事件

BUF_WRAP 和 EVENT_OVERFLOW 關(guān)鍵字
對于每個(gè)消費(fèi)者和監(jiān)視的每個(gè)事件,事件數(shù)據(jù)保存在一個(gè)循環(huán)的緩沖區(qū)中。如果寫入事件數(shù)據(jù)的速度比消費(fèi)者讀取數(shù)據(jù)快,可能會出現(xiàn)緩沖區(qū)回繞(wrap)。如果出現(xiàn)緩沖區(qū)回繞,會覆蓋事件數(shù)據(jù),所以 read() 調(diào)用不會返回部分事件數(shù)據(jù)。圖 5 說明緩沖區(qū)在緩沖區(qū)回繞之前和之后的樣子:

圖 5. 緩沖區(qū)回繞

如果出現(xiàn)緩沖區(qū)回繞,第一個(gè) read 只返回關(guān)鍵字 BUF_WRAP。第二個(gè) read 返回下一個(gè)事件發(fā)生的全部事件數(shù)據(jù)。應(yīng)該根據(jù) SEQUENCE_NUM 字段判斷緩沖區(qū)回繞覆蓋了多少個(gè)事件發(fā)生。如果監(jiān)視應(yīng)用程序遇到緩沖區(qū)回繞,可以增加在 BUF_SIZE 中指定的監(jiān)視緩沖區(qū)大小。不能動態(tài)地修改這個(gè)設(shè)置。
如果消費(fèi)者使用非常小的緩沖區(qū),一個(gè)事件發(fā)生的事件數(shù)據(jù)可能會超過緩沖區(qū)。在這種情況下,會把關(guān)鍵字 EVENT_OVERFLOW 寫入緩沖區(qū),并寫入緩沖區(qū)能夠容納的盡可能多的事件發(fā)生數(shù)據(jù)。在發(fā)生溢出的情況下,第一個(gè) read 只返回關(guān)鍵字 EVENT_OVERFLOW。下一個(gè) read 返回緩沖區(qū)能夠容納的事件數(shù)據(jù)。
如果在發(fā)生溢出的情況下發(fā)生回繞,第一個(gè) read 返回關(guān)鍵字 BUF_WRAP,第二個(gè) read 返回關(guān)鍵字 EVENT_OVERFLOW,第三個(gè) read 返回緩沖區(qū)能夠容納的事件數(shù)據(jù)。
示例程序檢查傳遞的事件數(shù)據(jù)是否包含 BUF_WRAP 關(guān)鍵字。如果發(fā)生了緩沖區(qū)回繞,就向用戶輸出警告。示例程序并不檢查 EVENT_OVERFLOW,因?yàn)樗付?INFO_LVL 為 1 并使用默認(rèn)緩沖區(qū)大小 4K。當(dāng)前,在 INFO_LVL 設(shè)置為 1 的情況下 modFile 事件的最大大小小于 4K。
重復(fù)事件數(shù)據(jù)整合
為了減少緩沖區(qū)回繞,AIX Event Infrastructure 會整合重復(fù)的未讀事件。在收集到新的事件數(shù)據(jù)時(shí),與最近的未讀事件數(shù)據(jù)進(jìn)行比較。如果每個(gè)事件發(fā)生的數(shù)據(jù)完全相同(除了時(shí)間戳和序號之外),那么更新以前寫的事件數(shù)據(jù)的時(shí)間戳和序號以反映這個(gè)新的重復(fù)的事件發(fā)生。
重復(fù)事件數(shù)據(jù)整合與緩沖區(qū)回繞的表現(xiàn)差異在于,在發(fā)生整合時(shí)并不會讀取到關(guān)鍵字 BUF_WRAP。
示例程序維護(hù)自己的內(nèi)部序號。它會比較預(yù)期的值和從事件發(fā)生數(shù)據(jù)讀取的實(shí)際值,從而判斷是否整合了重復(fù)事件。如果探測到不可用事件,那么這個(gè)內(nèi)部序號復(fù)位為 0。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP