現在簡單的描述一下zabbix_server端的各個進程及其功能
1.main_dbconfig_loop:這是一個同步數據庫的hosts表和items表的內容到內存的進程,時間間隔默認爲1s,由於這兩個表用的很頻繁,出於性能考慮,在內存上用哈希表的形式緩存了這兩個表的信息
2.main_watchdog_loop:用來檢查database有沒有掛掉,時間間隔默認60s,如果掛了需要向管理員報警,檢查的方式爲每隔60s重連一次數據庫,沒有報錯表明運行正常
3.main_poller_loop:調用get_values會主動連接zabbix_agent然後發送請求然後獲取zabbix_agent響應的數據,在get_values中調用dc_add_history函數將獲取的數據存放到history表的內存緩存中,並且要更新item的狀態(normal、unreachable),
4.main_trapper_loop:從監聽端口接收數據並調用process_trapper_child進行處理:
if (0 == strncmp(s, "ZBX_GET_ACTIVE_CHECKS", 21)) /* Request for list of active checks */ //與上一篇講的agent有個更新active_list的進程對應
{
ret = send_list_of_active_checks(sock, s);
}
else if (strncmp(s, "ZBX_GET_HISTORY_LAST_ID", 23) == 0) /* Request for last ids */
{
send_history_last_id(sock, s);
return ret;
}
else /* Process information sent by zabbix_sender */
{...}
5.main_pinger_loop:週期性針對每個item上的ip進行ping操作,週期是算出來的,具體怎麼算的還沒研究
6main_alerter_loop: 每隔30s將alerts表中的未發送的警報都發送出去,並且發送成功後將ALERT_STATUS_NOT_SENT改爲ALERT_STATUS_SENT
7.main_housekeeper_loop:定時對數據庫中一些過期的數據進行清理刪除
for (;;)
{
now = time(NULL);
DBconnect(ZBX_DB_CONNECT_NORMAL);
d = housekeeping_history_and_trends(now); //清除數據庫historys和trends表中過期的數據
housekeeping_process_log(now); //對housekeeper表中的過時數據進行清理
housekeeping_events(now); //清理acknowledges和events中的數據
housekeeping_alerts(now); //清理alerts中的數據
housekeeping_sessions(now); //清理sessions中的數據
DBclose();
zbx_sleep_loop(CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR);
}
8.main_timer_loop:這個進程最主要的功能就是定時的調用計算數據庫中定義的觸發器的值,如果新值和原有的值不相等,表示有新的事件產生,然後就將新的事件插入到數據庫,關鍵函數:process_time_functions, evaluate_expressions(用於計算觸發器表達式的值&產生事件),process_event(處理事件,主要是將新事件插入數據庫)
9.main_nodewatcher_loop:這個進程跟zabbix實現的分佈式部署有關係,最主要的函數是main_historysender,當這個進程運行在slave節點上時會週期性的將history數據(zabbix_agent收集到的監控數據)發送給master節點
10.main_httppoller_loop:週期性的檢測httptest表中定義的http服務是否運行正常,代碼中使用調用libcurl庫實現的
11.main_discoverer_loop:它會掃描定義ip地址範圍內的ip,如果發現有zabbix_agent存在則會將它加入hosts表中
12.main_dbsyncer_loop:負責將內存中的history數據(zabbix_agent發送的監控數據)同步到數據庫中
13.main_escalator_loop:escalator是將觸發器事件和所需執行的動作聯繫起來的一個表,這個相應動作可以是重複執行的,動作有兩個選擇:發送郵件和執行遠程shell命令
調用函數順序:process_escalations=》execute_escalation=》execute_operations,在execute_operations中可以看到,它其實就是在alert表中插入一條記錄,上面我們提到有個main_alerter_loop會週期性的處理這個表中數據
14.main_proxypoller_loop:用於主動連接代理,並且獲取代理上接收的history數據
15.main_selfmon_loop:用於收集收集系統本身的各個進程的運行情況如用掉的cpu時間
轉載請註明出處:http://blog.csdn.net/liujian0616/article/details/7946492