[20200305]netstat state=ESTABLISHED and timer=probe 2.txt
[20200305]netstat state=ESTABLISHED and timer=probe 2.txt
1.問題提出:
--//生產系統執行netstat發現大量的state=ESTABLISHED和timer=probe的網路連結。
# netstat -tnop 2>/dev/null | grep probe |wc -l
351
# netstat -tnop 2>/dev/null | grep probe |head -2
tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (18.23/0/0)
tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 12413/oraclezzzz1 probe (19.25/0/0)
--//而processes=5000,幾乎消耗351/5000*100=7.02%。而且如果從客戶端查詢網路連線已經消失了,也就是這些連線是死連線,毫無用
--//處。實際上春節前我就注意到這個問題,但是我沒探究,因為高峰時連線數已經達到48XX。如果疫情一過,程式的網路連線數肯定不
--//足。
--//順便說一下使用netatat和ss遇到的問題,如果在oracle,grid使用者執行netstat -tnop 。在PID/Program name列是看不到程式號相
--//關資訊的,注意一定要使用root使用者執行,在PID/Program name列才有顯示,
--//切記,我這裡犯了一點點小錯誤。
--//另外ss 只要加入-p引數執行異常緩慢,不知道為什麼。而且ss顯示太寬,我以前講過使用column -t 過濾,實際上不對齊。
--//應該使用expand效果更好。而且視乎存在某個快取的問題,一段一段的輸出資訊在使用expand過濾時。
--//而且還有小部分是state=FIN_WAIT1(佔11個), timer=probe的情況。
--//如果你連續檢查:
# watch -d -t -n 1 "netstat -tnop 2>/dev/null | grep qqq.
# seq 100 | xargs -IQ bash -c "netstat -tnop 2>/dev/null | grep qqq.| ts.awk ; sleep 1"
[2020-03-05 16:23:58] tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (3.29/0/0)
[2020-03-05 16:24:00] tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (1.07/0/0)
[2020-03-05 16:24:02] tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (119.22/0/0)
[2020-03-05 16:24:04] tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (117.17/0/0)
[2020-03-05 16:24:06] tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (115.08/0/0)
[2020-03-05 16:24:09] tcp 0 32120 aaa.bbb.ccc.ddd:1521 qqq. ESTABLISHED 16957/oraclezzzz1 probe (112.88/0/0)
--//probe後面的第1引數120->0->120->0不斷反覆。state=FIN_WAIT1也是一樣。第2,第3引數都是0,從來沒有變化。
--//注: The interpretation of field is, first field = timer countdown value, second field = no. of retransmissions,
--//third field= number of keepalive probes sent.
# ps -eLf | grep 1695[7]
oracle 16957 1 16957 0 1 Jan14 ? 00:00:01 oraclezzzz1 (LOCAL=NO)
--//STIME=Jan19,我抽查發現有一些顯示2019. 如何顯示完整的日期格式不知道.
2.問題分析:
--//透過資料庫查詢看看,我們系統透過觸發器在v$session.client_info記錄IP地址。
# netstat -tnop 2>/dev/null | grep probe |grep oraclezzzz1|awk '{print $5}' | sed -e "s/:/',/" -e "s/^/('/" -e "s/$/),/"
('qqq.),
...
SELECT *
FROM v$session
WHERE (client_info, port) IN ( ('qqq. 51586)
....
, ('qqq. 55470))
--//結果不再貼出,logon_time跨度 2019/11/27 17:15:38 -2020/2/7 10:31:31。
SELECT PREV_EXEC_START,logon_time,(PREV_EXEC_START-logon_time)*86400 sec,prev_sql_id
FROM v$session
WHERE (client_info, port) IN ( ('qqq. 51586)
...
, ('qqq. 55470))
order by 3 desc
--//(PREV_EXEC_START-logon_time)*86400大部分都是0或者是-1,而且prev_sql_id=b5j7y2r5zr37t.
> @ tpt/sqlid b5j7y2r5zr37t %
Show SQL text, child cursors and execution stats for SQLID b5j7y2r5zr37t child nvl('%','%')
HASH_VALUE PLAN_HASH_VALUE CH# SQL_TEXT
---------- --------------- ---- ------------------------------------------------------------------------------------------------------------------------------------------------------
3422260473 0 0 declare PRIVS_ERROR exception; --raise error,if rule exception,will trigger privs_error pragma exception_init(PRIVS_ERROR,-1031);
begin execute immediate 'begin tlogon.logon; end;'; exception when PRIVS_ERROR then raise; when others then rollback; end
capaalogon;
CH# PARENT_HANDLE OBJECT_HANDLE PLAN_HASH PARSES H_PARSES EXECUTIONS FETCHES ROWS_PROCESSED ROWS_PER_FETCH CPU_SEC CPU_SEC_EXEC ELA_SEC ELA_SEC_EXEC LIOS LIOS_EXEC PIOS SORTS USERS_EXECUTING
---- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- -------------- -------------- ---------- ------------ ---------- ------------ ---------- ---------- ---------- ---------- ---------------
0 000000131D196028 00000001FC3F2828 0 63547049 8 63588712 0 63587482 789794.321 .012420354 823529.875 .012950882 344748703 5.42153933 5343 0 0
--//防水牆導致的問題嗎?從PREV_EXEC_START-logon_time的差值看登入馬上就掛了。不會是該核心版本在網路處理上有bug,即使防水
--//牆導致連線斷開,連線也不應該保持這麼久不會斷開。
3.先解決state=FIN_WAIT1的情況:
--//參考連線: https://blog.csdn.net/microgp/article/details/86588973
FIN_WAIT1:
1、sysctl -a |grep net.ipv4.tcp_max_orphans(記下 net.ipv4.tcp_max_orphans的值第三步需要賦給orig_orphans)
2、sysctl -w net.ipv4.tcp_max_orphans=0 然後等待FIN_WAIT1的消失,可以用 netstat -np|grep 9080 反覆檢視,直到沒有任何條目
3、sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
--//在測試前我在測試環境做了測試,修改它並不影響業務。建議大家還是小心謹慎,自己再測試看看。
# sysctl -a |grep net.ipv4.tcp_max_orphans
net.ipv4.tcp_max_orphans = 262144
# sysctl -w net.ipv4.tcp_max_orphans=0
--//我的測試最多等3*120秒這些連線state=FIN_WAIT1會全部消失。
# sysctl -w net.ipv4.tcp_max_orphans =262144
4.解決state=ESTABLISHED and timer=probe:
--//先找一個不太重要的程式看看。
# netstat -tnop 2>/dev/null | grep 112514
tcp 0 25245 aaa.bbb.ccc.ddd:1521 rrr.ttt.yyy.215:1301 ESTABLISHED 112514/oraclezzzz1 probe (36.31/0/0)
# kill -9 112514
# ps -ef | grep 11251[4]
# netstat -tnop 2>/dev/null | grep rrr.ttt.yyy.215:1301
tcp 0 25246 aaa.bbb.ccc.ddd:1521 rrr.ttt.yyy.215:1301 FIN_WAIT1 - probe (57.31/0/0)
--//昏,state=FIN_WAIT1,對應程式已經不見了。但是連結還是保持,state=FIN_WAIT1。現在想想前面看到state=FIN_WAIT1的連線,不會當
--//時kill程式留下的把。
--//重複處理state=FIN_WAIT1步驟,該連線也會消失。
--//批次處理就簡單了。
1.先看一下是否都是oracle相關程式,不能是一些特殊程式,避免資料庫down掉.
# netstat -tnop 2>/dev/null | grep probe | awk '{print $7}' | cut -f1 -d"/" | paste -sd, | xargs ps v -p | column -t
2.建立kill指令碼
# netstat -tnop 2>/dev/null | grep probe | awk '{print $7}' | cut -f1 -d"/"|xargs -IQ echo kill -9 Q
3.執行:
# netstat -tnop 2>/dev/null | grep probe | awk '{print $7}' | cut -f1 -d"/"|xargs -IQ echo kill -9 Q | bash
or
# netstat -tnop 2>/dev/null | grep probe | awk '{print $7}' | cut -f1 -d"/"|xargs -IQ kill -9 Q
--//不放心把上面的指令碼copy下來,單獨自行。另外必須提的是如果net.ipv4.tcp_max_orphans=0,kill -9程式後馬上查詢
--// netstat -tnop 2>/dev/null | grep probe馬上消失。
--//不會出現前面state=FIN_WAIT1的情況。必須記住執行 sysctl -w net.ipv4.tcp_max_orphans=262144修改該引數回來。
4.檢查netsta 是否還有timer=probe的資訊.
# netstat -tnop 2>/dev/null | grep probe
5.總結:
--//1.不知道是否是在業務高峰密集登入導致的網路異常.因為登入是繞不開那個語句的執行的,還是該核心版本在網路上的bug.
--//2.netstat -ntop 注意選擇root使用者執行,不然看不到PID/Program name相關資訊.
--//補充一點在我的測試環境oracle使用者執行沒有問題,有點奇怪。
--//3.我感覺不能使用SQLNET.EXPIRE_TIME檢測網路連線,也許使用tcp keepalive特性要好一些.明天修改它,在1臺機器使用
--//tcp keepalive特性,另外1臺保持不變,再觀察看看.
--//我們rac環境跑2個資料庫,一臺使用tcp keepalive特性,另外一臺使用SQLNET.EXPIRE_TIME.再觀察看看。
net.ipv4.tcp_keepalive_time = 590
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 4
--//4.另外我懷疑我們前臺接入認證的軟體引起的問題。windows開機出現登入介面快,實際上是一個假象,我們登入後接入認證的程式
--//設計不好,會彈出一個介面,如果使用者選擇X而不是最小化,機器無法接入網路,不知道這個是否會引起這個問題。
--//5.對這個團隊再次失望,沒人重視這些細節問題。這樣被動的維護系統,真不知道以後會出什麼事情。今天上班檢查發現再次出現2
--//個連結。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2678760/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20200318]生產系統網路state=ESTABLISHED和Timer=probe分析3.txt
- Connection could not be established with host 求救
- netstat命令
- netstat -ano
- netstat -ntpl
- tomcat 監控工具probeTomcat
- netstat命令詳解
- unity 的reflection probe和environmentmapUnity
- posix timer
- The complete timer
- go timerGo
- WPF Image automatically display image via System.Timer.Timer
- RH Timer for MacRed Hot Timer定時器軟體Mac定時器
- Linux netstat 命令詳解Linux
- [Bash] ping netstat & traceroute Command
- linux netstat一點梳理Linux
- timer_list
- WIN配置git 配置後失敗 can't be establishedGit
- netstat -ano檢視路徑
- Linux netstat命令結果分析Linux
- go timer 洩漏Go
- A timer based on timerfd and epoll
- Timer(定時器)定時器
- Phaser的timer用法
- spdk nvme盤probe的流程詳細分析
- 追溯 MySQL Statement Cancellation TimerMySql
- Java - Timer定時器Java定時器
- Flink狀態專題:keyed state和Operator state
- [Vue] Sharing StateVue
- Vuex之stateVue
- netstat -ano | findstr :8079 taskkill /pid 38980 /f
- [轉帖]netstat -st輸出解析(二)
- 檢視網路連線數netstat -an
- demoValue: state => state.demoValue是什麼語法呢?
- WPF show ImageSource via MVVM and timerMVVM
- Flutter之Timer原理解析Flutter
- 理解ProcessFunction的Timer邏輯Function
- Java之定時器TimerJava定時器