inotify-tools、sersync配置及压力测试
?????? ??
一、Inotify介紹:
????? Inotify 是一個 Linux 內核特性,它監控文件系統,并且及時向專門的應用程序發出相關的事件警告,比如刪除、讀、寫和卸載操作等。您還可以跟蹤活動的源頭和目標等細節。
使用 inotify 很簡單:創建一個文件描述符,附加一個或多個監視器(一個監視器 是一個路徑和一組事件),然后使用 read 方法從描述符獲取事件。read 并不會用光整個周期,它在事件發生之前是被阻塞的。
?????? 內核版本不低于 2.6.13,系統就支持 inotify。? 同時可以查看內核參數
[root@localhost inotify]# cd /proc/sys/fs/inotify/
[root@localhost inotify]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 29 17:20 max_queued_events
-rw-r--r-- 1 root root 0 Aug 29 17:20 max_user_instances
-rw-r--r-- 1 root root 0 Aug 29 17:20 max_user_watches
[root@localhost inotify]# cat *
16384
128
8192
??????
?????? notify-tools 是為linux下inotify文件監控工具提供的一套c的開發接口庫函數,同時還提供了一系列的命令行工具,這些工具可以用來監控文件系統的事件。 inotify-tools是用c編寫的,除了要求內核支持inotify外,不依賴于其他。inotify-tools提供兩種工具,一是 inotifywait,它是用來監控文件或目錄的變化,二是inotifywatch,它是用來統計文件系統訪問的次數。現在介紹一下它的使用方法。
????? 查看notify-tools信息:? https://github.com/rvoicilas/inotify-tools/wiki
????? 結合rsync進行測試,腳本如下:
#!/bin/sh
cmd=`which inotifywait`
$cmd -mrq --timefmt "%F %T" --format "%T %f"? -e create,close_write,attrib /data? | while read date time file
do
? cd /data && rsync -azv $file cms@192.168.2.207::data --password-file=/etc/rsyncd.pass
done
注:加上delete事件會導致刪除同步錯誤,提示文件不存在,故刪除事件單獨啟個腳本進程。
????? 性能測試:
?????????? 針對大量的小文件 ,同步小文件太慢,直接同步目錄
?????????? 10-100k的小文件,并發達到200-300,需要對內核三個參數進行調優
?????????? max_queued_events: 320000? max_user_watches:5000000
在對一個大磁盤進行inotify監聽時,爆出如下錯誤:
Failed to watch /home/;
upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches’.
cat一下這個文件,默認值是8192,echo 8192000 > /proc/sys/fs/inotify/max_user_watches即可
二、sersync介紹:
sersync利用inotify與rsync對服務器進行實時同步,其中inotify用于監控文件系統事件,rsync是目前廣泛使用的同步算法,其優點是只對文件不同的部分進行操作,所以其優勢大大超過使用掛接文件系統的方式進行鏡像同步。由金山的周洋開發完成,是目前使用較多的文件同步工具之一。該工具和其他的工具相比有如下優點:
sersync是使用c++編寫,由于只同步發生更改的文件,因此比其他同步工具更節約時間、帶寬;
安裝方便、配置簡單;
使用多線程進行同步,能夠保證多個服務器實時保持同步狀態;
自帶出錯處理機制,通過失敗隊列對出錯的文件重新出錯,如果仍舊失敗,則每10個小時對同步失敗的文件重新同步;
自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次;
自帶socket與http協議擴展,你可以方便的進行二次開發;
??? 線程組線程是等待線程隊列的守護線程,當隊列中有數據的時候,線程組守護線程逐個喚醒,當隊列中inotify事件交多的時候就會被全部喚醒一起工作。這樣設計的目的是能夠同時處理多個inotify事件,重發利用服務器的并發能力(核數*2+2)。
? ? ? 之所以稱之為線程組線程,是因為每個線程在工作的時候,會根據服務器的數量建立子線程,子線程可以保證所有的文件與各個服務器同時同步,當要同步的文件較大的時候,這樣設計可以保證各個遠程服務器可以同時獲得要同步的文件。
?????? 服務線程的作用有三個,首先是處理同步失敗的文件,將這些文件 再次同步,對于再次同步失敗的文件會生成rsync_fail_log.sh腳本,記錄失敗的事件。同時每隔10個小時執行腳本一次,同時清空腳本。服務 線程的第三個作用是crontab功能,可以每隔一定時間,將所有路徑整體同步一次。
??? 過濾隊列的建立是為了過濾短時間內產生的重復的inotify信息,例如在刪除文件夾得時候,inotify就會同時產生刪除文件夾里的文件與刪除文件夾 得事件,通過過濾隊列當刪除文件夾事件產生的時候,會將之前加入隊列的刪除文件的事件全部過濾掉,這樣只產生一條事件減輕了同步的負擔。同時對于修改文件 的操作的時候,會產生臨時文件與重復操作。
???
配置文件說明:
下面做逐行的進行解釋說明:
1、 <host hostip="localhost" port="8008"></host>
hostip與port是針對插件的保留字段,對于同步功能沒有任何作用,保留默認即可。
2、filter文件過濾功能
對于sersync監控的文件,會默認過濾系統的臨時文件(以“.”開頭,以“~”結尾),除了這些文件外,可以自定義其他需要過濾的文件。
??? <filter start="true">
??????? <exclude expression="(.*)\.svn"></exclude>
??????? <exclude expression="(.*)\.gz"></exclude>
??????? <exclude expression="^info/*"></exclude>
??????? <exclude expression="^static/*"></exclude>
??????? <exclude expression="^APK/*"></exclude>
??????? <exclude expression="^IOSIPA/*"></exclude>
??? </filter>
將start設置為 true, 在exclude標簽中,填寫正則表達式,默認給出兩個例子分別是過濾以".gz"結尾的文件與過濾監控目錄下的info路徑(監控路徑/info /*),可以根據需要添加,但開啟的時候,自己測試一下,正則表達式如果出現錯誤,控制臺會有提示。相比較使用rsync 的exclude功能,被過濾的路徑,不會加入監控,大大減少rsync的通訊量。
3、inotify監控參數設定(優化)
對于inotify監控參數可以進行設置,根據您項目的特點優化srsync。
??? <inotify>
??????? <delete start="true"/>
??????? <createFolder start="true"/>
??????? <createFile start="false"/>
??????? <closeWrite start="true"/>
??????? <moveFrom start="true"/>
??????? <moveTo start="true"/>
??????? <attrib start="true"/>
??????? <modify start="true"/>
??? </inotify>
對于大多數應用,可以嘗試把createFile(監控文件事件選項)設置為false來提高性能,減少 rsync通訊。因為拷貝文件到監控目錄會產生create事件與close_write事件,所以如果關閉create事件,只監控文件拷貝結束時的事 件close_write,同樣可以實現文件完整同步。
注意:強將createFolder保持為true,如果將createFolder設為false,則不會對產生的目錄進行監控,該目錄下的子文件與子目錄也不會被監控。所以除非特殊需要,請開啟。
默認情況下對創建文件(目錄)事件與刪除文件(目錄)事件都進行監控,如果項目中不需要刪除遠程目標服務器的文件(目錄),則可以將delete 參數設置為false,則不對刪除事件進行監控。
4、失敗日志腳步配置
<failLog path="/opt/sersync/log/rsync_fail_log.log" timeToExecute="60"/>
對于失敗的傳輸,會進行重新傳送,再次失敗就會寫入rsync_fail_log,然后每隔一段時間(timeToExecute進行設置)執行該腳本再次重新傳送,然后清空該腳本。可以通過path來設置日志路徑。
5、Crontab定期整體同步功能
??????? <crontab start="false" schedule="24000"><!--600mins-->
??????????? <crontabfilter start="false">
??????????????? <exclude expression="*.php"></exclude>
??????????????? <exclude expression="info/*"></exclude>
??????????? </crontabfilter>
??????? </crontab>
crontab可以對監控路徑與遠程目標主機每隔一段時間進行一次整體同步,可能由于一些原因兩次失敗重傳都失敗了,這個時候如果開啟了crontab功能,還可以進一步保證各個服務器文件一致,如果文件量比較大,crontab的時間間隔要設的大一些,否則可能增加通訊開銷。schedule這個參數是設置crontab的時間間隔,默認是600分鐘
如果開啟了filter文件過濾功能,那么crontab整體同步也需要設置過濾,否則雖然實時同步的時候文件被過濾了,但crontab整體同步的時候如果不單獨設置crontabfilter,還會將需過濾的文件同步到遠程,crontab的過濾正則與filter過濾的不同,也給出了兩個實例分別對應與過濾文件與目錄。總之如果同時開啟了filter與crontab,則要開啟crontab的crontabfilter,并按示例設置使其與filter的過濾一一對應。
6、插件相關
??????? <plugin start="false" name="command"/>
??? </sersync>
??? <plugin name="command">
??????? <param prefix="/bin/sh" suffix="" ignoreError="true"/>? <!--prefix /opt/tongbu/mmm.sh suffix-->
??????? <filter start="false">
??????????? <include expression="(.*)\.php"/>
??????????? <include expression="(.*)\.sh"/>
??????? </filter>
??? </plugin>
??? <plugin name="socket">
??????? <localpath watch="/opt/fileserver">
??????????? <deshost ip="192.168.100.160" port="8009"/>
??????? </localpath>
??? </plugin>
??? <plugin name="refreshCDN">
??????? <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
??????????? <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
??????????? <sendurl base="http://pic.xoyo.com/cms"/>
??????????? <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/p_w_picpaths"/>
??????? </localpath>
??? </plugin>
如上面的xml所示,其中plugin標簽設置為true時候,在同步文件或路徑到遠程之后后,調用插件。通過name參數指定需要執行的插件。目前支持的有command refreshCDN?socket?http四種插件。http插件目前由于兼容性原因去除,以后會重新加入。
command插件當文件同步完成后,會調用command插件,如同步文件是test.php,則test.php文件在改動之后,調用rsync同步到遠程服務器后,調用command插件,執行
/bin/sh test.php? suffix>/dev/null 2>&1
如果suffix 設置了,則會放在inotify事件test.php之后
如果ignoreError為true,則會添加>/dev/null 2>&1
當然還可以設置command的filter,當filter為ture,include可以只對正則匹配到的文件,調用command。
刷新CDN插件“refreshCDN”,就在同步過程中將文件發送到目的服務器后刷新cdn接口。如果不想使用,則將start屬性設為false即可。如果需要使用其他插件,則查看其他plugin標簽,將插件名稱改為 xml中其它插件的名稱即可。
?????? 以下模塊(refreshCDN http socket)可以單獨使用,只需在命令行下使用-m?參數即可。如果需要作為插件與同步程序一起使用,見同步程序說明的插件配置。
????? 該模塊根據chinaCDN的協議,進行設計,當有文件產生的時候,就向cdn接口發送需要刷新的路徑位置。刷新CDN模塊需要配置的xml文件如下。
其中?localpath?watch?是需要監控的目錄。
cdnifo標簽制定了cdn接口的域名,端口號,以及用戶名與密碼。
sendurl標簽是需要刷新的url的前綴。
regexurl標簽中的,regex屬性為true時候,使用match屬性的正則語句匹配inotify返回的路徑信息,并將正則匹配到的部分作為url一部分,
舉例:
如果產生文件事件為:/data0/htdoc/cms.88181.com/site/jx3.88181.com/p_w_picpath/a/123.txt
經過上面的match正則匹配后,最后刷新的路徑是:
http://pic.88181.com/cms/jx3/a/123.txt;
如果regex屬性為false,最后刷新的路徑是
http://pic.88181.com/cms/jx3.88181.com/p_w_picpaths/a/123.txt;
三、inotify及sersync壓力測試
環境介紹:
?? 172.16.171.100??? 測試客戶機、nfs客戶端
?? 172.16.171.110??? inotify、sersync端 、nfs服務端
?? 172.16.171.120??? rsync服務端
?? 均為CentOS release 6.6 64位系統,4核2G
1、測試腳本介紹:
[root@openstack-nova test]# ll
total 61680
-rw-r--r--. 1 root root? 1024000 Aug 30 11:27 1000k.txt
-rw-r--r--. 1 root root?? 102400 Aug 30 11:27 100k.txt
-rw-r--r--. 1 root root??? 10240 Aug 30 10:28 10k.txt
-rw-r--r--. 1 root root 10240000 Aug 30 11:39 10m.txt
-rw-r--r--. 1 root root?? 512000 Aug 30 11:27 500k.txt
-rw-r--r--. 1 root root??? 51200 Aug 30 10:28 50k.txt
-rw-r--r--. 1 root root 51200000 Aug 30 11:39 50m.txt
-rwxr-xr-x. 1 root root????? 313 Aug 30 11:09 test.sh
cat test.sh
#!/bin/sh
count=20
a=1
name=$1
num=$2
file=$3
while [ "$a" -le "$num" ]
do
?? for ((i=1;i<=$count;i++))
??? do
?????? [ ! -e /cms/$name/$i ] &&? /bin/mkdir /cms/$name/$i
?????? /bin/cp ${file}.txt /cms/$name/$i/${file}_`echo $(date)$RANDOM | md5sum | cut -c 1-8`.txt
??? done
?? a=`expr $a + 1`
?? sleep 1
done
2、針對sersync目錄進行10K、500K、1000K、10M測試,測試命令如下:
sh test.sh sersync 20 10k
sh test.sh sersync 20 500k
sh test.sh sersync 20 1000k
sh test.sh sersync 20 10m
172.16.171.110(sersync端)和172.16.171.120(rsync)端查看統計命令:
while true; do tree sersync/ | wc -l; sleep 1 ;done | tee -a sersync.log
結果如下:
| id | s(10k) | r(10k) | s(500k) | r(500k) | s(1m) | r(1m) | s(10m) | r(10m) |
| 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| 2 | 43 | 36 | 43 | 39 | 43 | 14 | 21 | 11 |
| 3 | 63 | 53 | 63 | 54 | 43 | 43 | 43 | 30 |
| 4 | 78 | 63 | 78 | 63 | 63 | 63 | 45 | 43 |
| 5 | 83 | 83 | 83 | 83 | 83 | 83 | 59 | 51 |
| 6 | 103 | 103 | 103 | 103 | 103 | 98 | 63 | 63 |
| 7 | 123 | 123 | 123 | 123 | 123 | 110 | 70 | 64 |
| 8 | 143 | 143 | 143 | 143 | 125 | 123 | 74 | 69 |
| 9 | 163 | 153 | 163 | 153 | 143 | 143 | 74 | 71 |
| 10 | 182 | 163 | 172 | 163 | 163 | 163 | 75 | 73 |
| 11 | 183 | 183 | 183 | 183 | 183 | 183 | 77 | 73 |
| 12 | 203 | 203 | 203 | 203 | 203 | 193 | 77 | 76 |
| 13 | 223 | 223 | 223 | 223 | 214 | 203 | 78 | 77 |
| 14 | 243 | 243 | 243 | 235 | 223 | 223 | 80 | 83 |
| 15 | 263 | 253 | 259 | 247 | 243 | 243 | 82 | 83 |
| 16 | 283 | 263 | 263 | 263 | 263 | 258 | 83 | 84 |
| 17 | 284 | 283 | 283 | 283 | 281 | 266 | 88 | 85 |
| 18 | 303 | 303 | 303 | 303 | 283 | 283 | 90 | 88 |
| 19 | 323 | 323 | 323 | 323 | 303 | 303 | 94 | 90 |
| 20 | 343 | 343 | 343 | 333 | 323 | 323 | 99 | 95 |
| 21 | 363 | 359 | 348 | 343 | 343 | 333 | 100 | 96 |
| 22 | 383 | 372 | 363 | 363 | 352 | 343 | 100 | 99 |
| 23 | 392 | 383 | 383 | 383 | 363 | 363 | 102 | 100 |
| 24 | 403 | 403 | 403 | 403 | 383 | 383 | 103 | 103 |
| 25 | 423 | 423 | 423 | 416 | 403 | 399 | 109 | 103 |
| 26 | 423 | 421 | 408 | 112 | 106 | |||
| 27 | 423 | 423 | 115 | 107 |
從統計結束來看:
在172.16.171.110上直接生成文件
文件大小在1M之內的小文件,同步效率在秒級。
10M的大文件sersync端使用了126秒,rsync端同步完成共使用了161秒。
在172.16.171.100上以nfs掛載,并批量生成文件進行測試。
10K文件使用28-29秒,500K文件使用45秒,1M文件使用70秒,10M文件使用279秒,同步完成使用281秒
3、針對inotify目錄進行10K、500K、1000K、10M測試,測試命令如下:
sh test.sh inotify 20 10k
sh test.sh inotify 20 500k
sh test.sh inotify 20 1000k
sh test.sh inotify 20 10m
172.16.171.110(inotify端)和172.16.171.120(rsync)端查看統計命令:
while true; do tree inotify/ | wc -l; sleep 1 ;done | tee -a inotify.log
結果如下:
| id | s(10k) | r(10k) | s(500k) | r(500k) | s(1m) | r(1m) | s(10m) | r(10m) |
| 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| 2 | 43 | 43 | 43 | 43 | 43 | 37 | 43 | 8 |
| 3 | 63 | 63 | 63 | 56 | 63 | 54 | 48 | 29 |
| 4 | 83 | 82 | 80 | 63 | 83 | 66 | 63 | 32 |
| 5 | 83 | 83 | 83 | 83 | 84 | 83 | 77 | 37 |
| 6 | 103 | 103 | 103 | 103 | 103 | 103 | 80 | 42 |
| 7 | 123 | 123 | 123 | 123 | 123 | 123 | 83 | 43 |
| 8 | 143 | 143 | 143 | 143 | 143 | 137 | 103 | 43 |
| 9 | 163 | 163 | 163 | 156 | 163 | 150 | 110 | 44 |
| 10 | 183 | 172 | 171 | 166 | 176 | 166 | 115 | 47 |
| 11 | 186 | 183 | 183 | 183 | 183 | 183 | 117 | 47 |
| 12 | 203 | 203 | 203 | 203 | 203 | 203 | 123 | 47 |
| 13 | 223 | 223 | 223 | 223 | 223 | 223 | 123 | 48 |
| 14 | 243 | 243 | 243 | 241 | 243 | 236 | 124 | 54 |
| 15 | 263 | 263 | 263 | 247 | 259 | 245 | 125 | 58 |
| 16 | 283 | 271 | 264 | 263 | 263 | 263 | 136 | 63 |
| 17 | 288 | 286 | 283 | 283 | 283 | 283 | 136 | 64 |
| 18 | 303 | 303 | 303 | 303 | 303 | 301 | 139 | 64 |
| 19 | 323 | 323 | 323 | 323 | 323 | 313 | 140 | 64 |
| 20 | 343 | 343 | 343 | 336 | 333 | 323 | 143 | 64 |
| 21 | 363 | 363 | 355 | 346 | 343 | 343 | 143 | 66 |
| 22 | 383 | 383 | 363 | 363 | 363 | 363 | 143 | 71 |
| 23 | 394 | 393 | 383 | 383 | 383 | 378 | 150 | 72 |
| 24 | 403 | 403 | 403 | 403 | 403 | 391 | 158 | 72 |
| 25 | 423 | 423 | 423 | 421 | 414 | 405 | 160 | 72 |
| 26 | 423 | 423 | 423 | 163 | 72 |
從統計結束來看:
在172.16.171.110上直接生成文件
文件大小在1M之內的小文件,同步效率在秒級,和sersync效率不相上下。
10M的大文件inotify端使用了103秒,rsync端同步完成使用了410秒,要遠遠超過sersync。
在172.16.171.100上以nfs掛載,并批量生成文件進行測試。
10K文件使用28-29秒,500K文件使用41秒,1M文件使用50秒,10M文件使用210秒,同步完成使用216秒
總結:當并發大量生成大文件時,sersync因多線程效率會高點,當并發量一般時,感覺inotify效率更高點。
??
轉載于:https://blog.51cto.com/wushank/1689616
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的inotify-tools、sersync配置及压力测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于使用两个GTP/GTX出现[DRC
- 下一篇: ORA-00119错误的解决。