成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux事件監控機制遺漏事件問題的相關分析

運維 系統運維
Epoll+iNotify結合的機制可以用來監控Linux下文件系統的變化,不過在過于頻繁的往目錄下添加文件和目錄的時候,會丟事件。本文對如何解決漏事件的問題進行了探討,提供了兩種解決方案的思路。

目前比較通用的監控Linux下文件系統變化的是Epoll+iNotify結合的機制.

Epoll有兩種機制,LevelTrigger和EdgeTrigger, 前者相當于fast poll, 后者可以理解為對nonblocking fd的阻塞化, 這個說法嚴格來講有點兒業余,只是為了簡單的說明問題.

對于從epoll_wait等待事件觸發,然后進行read.這里做下說明,在讀事件的時候, Linux下的epoll是異步讀,而Windows下的IOCP是同步讀,從后面的分析可以發現,同步讀似乎更有優勢.

開始的時候,對于wait事件發生并進行read的線程,并沒有提高其優先級,發現在過于頻繁的往目錄下添加文件和目錄的時候,會丟事件.這樣在做實時同步時,要想辦法彌補丟失的事件.

第一個方案是對新添加的目錄,先把目錄add_watch,然后把該目錄掃描一遍.add_watch只是為了確保新建目錄被加入watch,一般不會漏掉的,除非是在事件被漏掉的情況下.漏掉指的是在目錄新建并上報到加入watch前的這段時間,在該目錄下又發生了新建文件或目錄時,會漏事件. iNotify是允許對同一個目錄add_watch兩遍的,但是由于add時還要訪問硬盤,確保目錄存在才能添加,所以做了一個緩存,path<--->wd,通過path的查找確定是否已add_watch,若沒add再add下.

第一個方案里漏事件的問題通過事后掃描得到解決,但是再掃描一遍是否有意義呢? 分析了Linux的線程有限級和調度策略之后,發現實時優先級有兩種SCHED_FIFO和SCHED_RR.從Linux kernel development里chapter4 RealTime看到:

“SCHED_RR is identical to SCHED_FIFO except that each process can run only until it exhausts a predetermined timeslice. That is, SCHED_RR is SCHED_FIFO with timeslicesit is a real-time round-robin scheduling algorithm. When a SCHED_RR task exhausts its timeslice, any other real-time processes at its priority are scheduled round robin. The timeslice is used only to allow rescheduling of same-priority processes.”

這也就是說,若是把讀事件的線程設置為FIFO,則沒有timeslice的限制,可以直到讀完事件,并且不會被搶占;而用RR則在timeslice用完一個之后,就會調度到別的線程,覺得可以用FIFO的設置來替代低效的掃描。

注1:

設置線程策略可以用下面的api:

  1. pthread_attr_getschedpolicy(const pthread_attr_t *restrict attr, int *restrict policy);  
  2. pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy );  
  3.  

設置線程優先級可以用下面的api:

  1. int sched_get_priority_max(int policy);  
  2. int sched_get_priority_min(int policy);  
  3. int pthread_attr_getschedparam(const pthread_attr_t *restrict attr,  
  4.               struct sched_param *restrict param);  
  5. int pthread_attr_setschedparam(pthread_attr_t *restrict attr,  
  6.               const struct sched_param *restrict param);  
  7.  struct sched_param sched;  
  8.  sched.sched_priority = sched_get_priority_max(SCHED_FIFO);  
  9.  pthread_attr_setschedparam( attr, &sched );  
  10.  

第二個方案的產生是因為在實現了第一個方案之后,發現多CPU或多core的情況下,仍然有漏報事件發生,而且漏報無規律可循,文件或目錄的個數不定,.再做了多種模擬測試之后,發現在單CPU下,讀事件是沒有問題的,但是在多CPU下,讀事件的線程是分配了core的個數個的.這時會發現讀到的事件不是一般的亂,而且無規律可循.在沒有任何分析的情況下,我假定inotify會對他內部的RB-Tree的讀取做了同步的,所以為了效率就肆無忌憚的用多個線程去讀了,結果在多U下,就給讀亂了.在把讀取線程改為一個后,就沒有漏事件了;但是考慮到效率問題,還是要用多個線程去讀的.或者可以對每個線程的read進行加鎖,這樣就可以保證讀的時候,在iNotify的buffer里是同步的了.具體效果如何,還有待明天驗證;

在這里插一句,Windows的iocp是同步讀的,是先read然后再getiocpstatus的,Linux的Epoll是反過來的,是異步讀取的.個人覺得可能是ms已經對異步讀的方式進行了測試,最后選定了同步讀的方式,這樣對寫應用的人來說,是要省不少心的.而且還有一點,inotify沒有加迭代監控子目錄的參數,而Windows卻有了這種考慮,這一點也算是win在設計上考慮比較全面的地方吧.

【編輯推薦】

  1. 善用腳本 讓你的Nagios記錄系統監控日志(附vmstat詳解)
  2. 安全實現Linux網絡監控
  3. Linux監控工具的展覽館
責任編輯:yangsai 來源: chinaunix博客
相關推薦

2010-06-23 11:24:23

Linux Bash命

2023-10-08 08:23:44

Android事件邏輯

2010-07-29 10:33:59

Flex鍵盤事件

2009-12-08 16:42:48

WCF Service

2010-08-06 09:45:50

Flex事件機制

2010-08-12 15:35:44

Flex事件機制

2016-12-08 10:19:18

Android事件分發機制

2010-08-04 13:52:53

Flex事件機制

2010-08-06 09:56:06

Flex事件機制

2010-08-06 10:03:42

Flex事件

2023-09-14 15:15:36

2023-09-07 10:31:27

2020-10-22 10:58:23

Ryuk 勒索

2010-05-07 15:40:18

ibmdwLinux

2010-11-04 14:19:46

DB2事件監控

2009-12-29 17:25:36

Silverlight

2009-12-30 10:44:38

Silverlight

2009-12-31 16:38:19

Silverlight

2013-04-24 11:15:56

Android開發Touch事件傳遞機制

2010-08-04 14:07:59

Flex事件機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久一区二区三区 | 欧美日韩视频在线播放 | 亚洲欧美综合网 | 97视频在线观看网站 | 色一情一乱一伦一区二区三区 | 成人免费小视频 | 欧美一区二区三区四区五区无卡码 | 中文字幕国产精品 | av一级毛片 | 国内久久精品 | 国产精品久久久久久久久久不蜜臀 | 一区二区免费 | www.9191.com| 国产精品成av人在线视午夜片 | 美国a级毛片免费视频 | 欧美亚洲视频 | 超碰日本 | 一区二区三区国产好的精 | 亚洲一本 | 99亚洲精品视频 | 精品网站999www | 国产一区二区久久 | 欧美久久久久久 | 一区二区三区免费 | 天天干精品| 精品一区二区不卡 | 俺去俺来也www色官网cms | 天堂中文字幕av | 国产成人免费 | 一区亚洲| 亚洲综合五月天婷婷 | 91久久精品国产免费一区 | 午夜影院在线观看 | a国产视频 | 综合二区 | 视频一区在线观看 | 国产 欧美 日韩 一区 | 97热在线| 天天射夜夜操 | 精品三区 | 91资源在线 |