今天羣里正好有人問一個狀況,用戶的業務併發鏈接忽然飆升,做爲部署在敏感位置的F5設備,並無自動記錄鏈接請求日誌的現成功能,若發生這種狀況,用戶須要知道當時的鏈接表狀況,起碼要知道是哪一個IP地址發出的大量請求。
bash
F5面對這種狀況,基本有2個選擇:
服務器
一、在VS中關聯iRule,記錄每次的tcp請求狀況,包括請求原地址、源端口、net成內部地址、net成內部端口、分發到哪臺服務器等信息。可是記錄這些日誌很是消耗設備性能,我記的有一個用戶就非要作這個,怎麼勸都不聽,他的設備併發峯值是1200萬/s,也就是有可能一瞬間要寫入上百萬條日誌,非要作就作吧,郵件裏把事情的狀況寫明,致使的後果寫明,iRule給他,要作就本身作吧。果不其然,真是立竿見影,放上去點了一下「update」,設備宕機了。併發
二、每隔一段時間去檢查一下鏈接表條目數,若是超過閥值就記錄當前的鏈接表狀況,而且根據原地址進行過濾排序。我認爲這種方式要好一些,就算你的併發有1200萬,我顯示鏈接表,對鏈接表信息過濾等等操做,也只是相對速度慢了一些,對設備不會形成太大影響。tcp
#!/bin/bash function define() { threshold=20000 log_path=/tmp/f5_conn_log/ user=`whoami` } function check() { if [ $user != root ];then echo "Please use root user." exit 1 fi if [ ! -d $log_path ];then mkdir $log_path fi } function gather() { while true do timestamp=`date +%Y%m%d_%H%M%S` num_conn=`tmsh show sys connection | wc -l` if [ $num_conn -gt $threshold ];then tmsh show sys connection>${log_path}${timestamp}.log awk -F ':' '{print $1}' ${log_path}${timestamp}.log | sort -nr | uniq -c | sort -nr | head -20 >> ${log_path}${timestamp}_top.log fi sleep 300 done } function main() { define check gather } main
腳本是個while死循環,使用的時候加上&放到後臺,能夠設置爲開機啓動。ide
每次取到的信息是2個文本文件,一個是完整的鏈接表,另外一個是對鏈接表進行過濾排序的top20。性能
[root@F5:Active] f5_conn_log # cat 20160114_164101_top.log 5841 192.168.1.7 1674 192.168.1.104 1462 164.115.20.151 317 192.168.4.110 274 192.168.4.84 258 192.168.1.248 257 192.168.4.13 246 192.168.1.76 214 192.168.1.85 199 192.168.1.146 183 192.168.1.120 169 192.168.1.166 165 192.168.1.134 163 172.18.0.131 161 192.168.1.115 155 100.90.90.150 153 192.168.1.6 148 192.168.100.76 142 172.18.0.107 137 192.168.1.150