Golang 服务之坑:too many open files
🕘 by pyList at 2020-02-17 20:01
出现这个问题是因为服务的文件句柄超出系统限制。当Go服务程序出现这个问题,首先应该看系统设置,然后再看程序本身。
大量的 accept4
错误
http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 1s
http: Accept error: accept tcp [::]:443: accept4: too many open files; retrying in 1s
系统设置
首先查看系统
ulimit -n
默认是 1024
,要改大一些。
ulimit -n 524288
这是临时的修改,要永久的修改,可修改文件 /etc/security/limits.conf
参见
- Linux 系统永久设置ulimit https://pylist.com/t/1516149794 42
看系统之后还要看你的程序的句柄限制,因为你的程序部署问题,系统设置修改了,但程序的设置还没变。可以使用下面命令行查看程序的限制
cat /proc/{your_app_pid}/limits
结果可能类似这样:
上图的 Solft Limit
还是 1024
,我用的是 supervisor
,必须重启 supervisor。重启后参数如下图:
程序设置
如果不注意,代码里可能存在一些连接泄漏。常见的泄漏是在 http.Response
调用之后忘记调用 resp.Body.Close()
,或者是放置位置不对。
空闲连接可能是另一个可能的原因。 默认情况下,会使用缓存来重用连接。访问许多主机时,这可能会留下许多打开的连接。 可以使用 Transport
的 CloseIdleConnections
方法以及MaxIdleConnsPerHost
和 DisableKeepAlives
字段来管理此行为。
如果是这种情况,可以尝试在传输句柄上显式调用 CloseIdleConnections
或减小MaxIdleConnsPerHost
的值。
还应该在 http server/client 添加超时机制来避免连接泄漏,如:
srv := &http.Server{
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
TLSConfig: tlsConfig,
Handler: serveMux,
}
var tr = &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
TLSHandshakeTimeout: 5 * time.Second,
ResponseHeaderTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
var httpClient = &http.Client{
Timeout: time.Second * 30,
Transport: tr,
}
下面的命令可以让你判断是不是连接池中的连接有没有正确关闭:
# cat /proc/19213/net/sockstat
sockets: used 109
TCP: inuse 4 orphan 0 tw 14 alloc 9 mem 2
UDP: inuse 5 mem 16
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
如果 TCP inuse
很大,就很有可能是连接没有正确关闭。
本文网址: https://pylist.com/t/1581940902 (转载注明出处)
如果你有任何建议或疑问可以在下面 留言
精彩评论
发表评论
相关推荐
小工具
标签
files
mac
open
解决
办法
golang
模版
缓存
方法
utf
gbk
big5
转换
time
timestamp
小结
时间
webdriver
微博
selenium
登录
断言
类型
注意
问题
网页
正文
提取
新闻
正则
字符串
切割
lru
高效
简单
template
tornado
tenjin
性能
openwrt
国内
bbr
路由
开启
虚拟机
virtualbox
很慢
网络
硬件加速
ubnt
er
固件
python
form
data
post
上传
练手
准备
项目
一个
app
store
未知
判断
当前
是否
低功耗
web
爬虫
服务器
组装
csv
读写
文件
标准
中文
分割
英文
google
身份验证
authenticator
迁移
手机
默认值
struct
设置
ngx
参数
获取
语言包
go
镜像
自动更新
microsoft
关闭
静音
风扇
主机
笔记本
改造
微信
尝鲜
视频
体验
cpu
debian
ubuntu
查看
温度
chrome
server
浏览
gnu
linux
安装
系统启动
usb
编译
宅家
坑记
屏幕
动手
nginx
quic
抢先
useragent
搜索引擎
蜘蛛
真假
识别
最近发表
- Mac 关闭 Microsoft 自动更新
- Mac 登录 App Store 出现“发生了未知错误”的解决方法
- 老笔记本改造为无风扇静音主机方案
- 自己组装21瓦低功耗家庭爬虫、文件、web服务器
- 微信视频号尝鲜体验
- Ubuntu/Debian 查看CPU温度的方法
- 在Ubuntu/debian Server 系统使用Chrome 无头浏览模式
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- 使用Golang selenium WebDriver 自动登录微博
- 在 Ubuntu 或其它 GNU/Linux 系统下安装 Debian
- Mac 下制作 USB ubuntu/debian 系统启动、安装盘的几种方法
- ubuntu/debian 下自行编译 OpenWRT 固件
- 宅家自己动手换手机屏幕掉坑记
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- 在 Nginx 和 Golang web 上抢先体验 QUIC
- 从UserAgent识别搜索引擎并判断真假蜘蛛
最近浏览
- OpenWrt 国内源
- Openwrt 路由上开启BBR
- VirtualBox 虚拟机里网络很慢的解决方法
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- python form-data post上传数据简便方法
- 准备拿一个简单的go 项目练手
- Mac 登录 App Store 出现“发生了未知错误”的解决方法
- python 判断当前时间是否在某两个时间点之间
- 自己组装21瓦低功耗家庭爬虫、文件、web服务器
- 一个简单高效的LRU 缓存,golang 实现
- python 标准库读写CSV 文件
- python 分割中文英文混合字符串的正确方法
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- go struct 设置默认值
- ngx 获取post 或 get 参数
- Go 语言包国内镜像
你好,我是 pylists.com云课堂系统的独立开发者,想购买你的域名 pylist.com,不知道你是否可以转让给我,我买域名之前一直没有联系到你。