Timeout原因整理-以Golang為例-Joe 的備忘錄
文章推薦指數: 80 %
網路連線中有各種timeout, connection timeout, readtimeout, ... 或是Golang dial tcp IP:PORT: connect: connection timed out通常是什麼原因呢?
Togglenavigation
Joe'sNotes
Home
前言
connnectiontimeout
Ping工具檢查
telnetPort檢查
權限檢查
DNS檢查
read/write或i/otimeout
程式實做問題
程式端timeout時間比伺服器長
前言
網路連線中有各種timeout,connectiontimeout,readtimeout,writetimeout等等,到底這些錯誤是什麼情況造成的呢?這邊以Go為例子整理出常見的timeout原因
connnectiontimeout
在建立連線的時候,如果遇到JAVAjava.net.ConnectException:Connectiontimedout:connect或是GolangdialtcpIP:PORT:connect:connectiontimedout通常是什麼原因呢?其實原因不外乎
*與目的地網路不通
*沒有權限連入(e.g.MySQL,Redisetc.)
*連到錯誤的IP(??)
前兩個比較好理解,第三個又是什麼意呢?以AWS為例,當你在EC2在照著官方的權限設定(VPC,SecurityGroup配置)下想要連到RDS好了,假設你的RDS是my-rds.ld2kfdi343.us-west-2.rds.amazonaws.com,這時候AWS的DNS伺服器給你的會是這一台的PrivateIP,但假設你把DNS改成8.8.8.8呢?你會發現你拿到的會是PublicIP,這時候你就連不進去了!提供我常用檢查的SOP
Ping工具檢查
假設你要連的目的地是10.2.3.1,可以試試Ping一下
ping10.2.3.1
如果可以ping通代表網路是通得,但如果不通呢?也不一定是不通,因為對方可能沒打開ICMP。
(但如果有通就代表不是網路連接問題))
telnetPort檢查
以MySQL來說,可以直接用telnet連檢查是否可以連線,如果可以連線,則可以往MySQL權限檢查,如果不行,可以檢查一下防火牆、securitygroup,或是VPC。
telnetmy-rds.ld2kfdi343.us-west-2.rds.amazonaws.com3306
權限檢查
如同上一條提到,網路如果是通得,就檢查一下MySQL裡的權限設定。
DNS檢查
我們都知道假設需要連到某個域名,例如my-rds.ld2kfdi343.us-west-2.rds.amazonaws.com,必須先轉換成IP才能溝通。
如果是無法解析,在Ping的時候就會發現了。
那又為什麼要獨立寫呢?以Golang為例,目前版本預設是pureGoresolver(也就是Go自己寫的)去讀系統的/etc/hosts及/etc/resolve.conf得到DNS清單,當程式裡需要連線的時候,假設/etc/hosts沒有就會按照順序去詢問/etc/resolve.conf的DNS,第一台解析錯誤就會問第二台。
所以假設你在/etc/resolv.conf設定兩個DNS
#awsdnsserver
nameserver10.2.0.2
#googlednsserver
nameserver8.8.8.8
當第一台掛掉的時候,Go會去詢問8.8.8.8,以剛剛的例子my-rds.ld2kfdi343.us-west-2.rds.amazonaws.com就會得到publicIP,然後程式試著要去連publicip就會遇到connectiontimeout.
read/write或i/otimeout
read/writeori/otimeout通常是發生在connectionpool裡(但不是絕對),情境有可能是:
程式實做問題
就超過你設定的timeout,檢查一下是不是程式或資料庫語法沒寫好
程式端timeout時間比伺服器長
假設程式端連到MySQL的read/writetimeout設成10s好了,但你在MySQL(也就是目的地)timeout設成8,這個時候你只要read/write超過8秒對方就把你斷線,這時候你就會遇到類似packets.go:33:readtcpx.x.x.x:x->x.x.x.x:x:i/otimeout。
這時候記得程式端的timeout時間最好短於伺服器端。
(MySQLorRedis等等都是)
「您的支持是創作的原動力」
贊助支持
×
Joe'sNotes
您的支持是創作的原動力
10元
20元
40元
80元
100元
任意金额
2元
使用Wechat(微信))掃描QRCode贊助我吧!
←
PreviousPost
Next
Post→
commentspoweredbyDisqus
FEATUREDTAGS
amazon
architecture
aws
cloudfront
dns
docker
ffmpeg
go
go-module
golang
hugo
linux
multi
mysql
network
nginx
performance
php
php-fpm
proxy
rds
redis
s3
shell
stage
timeout
tips
tool
video
延伸文章資訊
- 1Connection timed out和Connection refused的区别 - CSDN博客
- 2Connection timed out: connect 解決辦法- IT閱讀
如果不能訪問,就證明是Linux防火牆的原因,(表示就卡在這一步). 解決:. 修改Linux防火牆:. cd /etc/sysconfig. vi iptables.
- 3Connection timed out 怎么回事 - 百度知道
connect timed out 解决办法 ... 例如:mysql的远程访问,ip就是ping得通,它就是不能访问,纠其原因,端口被killer了,开放myslq端口即可访问发生的原因: 防...
- 4一次HTTP connect-timeout的排查(上) - 简书
- 5【已解決】java.net.ConnectException: Connection timed out
【已解決】java.net.ConnectException: Connection timed out: no further information. 2018-12-23 254. 前言:...