1. 使用长连接测试:
(1). 场景:
①. 相关命令:
ab -n 5000 -c 2000 -k http://localhost:8080/v1/books?page=abc&size=2
jmeter脚本
②. 服务器报错:
http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 1s
(2). 原因:
①. 文件描述符过多导致:
a. 应用层的一个socket对象代表内核的一个tcp连接,一个socket对应这个一个文件描述符.
b. 操作系统对一个进程所能打开的文件描述符有数量和总量的限制.
②. 句柄:
a. 在打开多进程、多线程、多协程的时候,都是在打开linux文件,需要一定的句柄资源设置.
b. 初始化linux句柄只有1024,在平常使用是没有问题,但做socket输出或web服务器肯定是不行的.
c. gin在开进程、协程的时候,超过最大的句柄打开数,导致报错(但也不是越大越好,内存就宕机了).
③. 一般使用go、swoft这种多线程程序,一般是需要在生产环境修改的.
(3). 查看所有的linux资源限制:
ulimit:显示或设置用户可以使用的资源的限制(分为软限制和硬限制).
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1890
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024 // 打开文件,默认1024.可使用ulimit -n单独查看
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1890
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
(4). 查看指定进程ID的句柄数:
①. 安装lsof:
yum install -y lsof
②. 查看gin进程:
ps -aux | grep gin
root 6379 0.0 1.1 113648 5776 pts/0 Sl+ 06:03 0:00 ./gin
③. 查看指定进程ID的句柄数(列出当前系统打开文件的工具):
lsof -p 6379 | wc -l // 每次执行的gin进程ID不一定相同
11 // 在压测的时候,值查看值会越来越大,超过预设值,就会报错.
④. 实时监听变化情况:
watch -n 1 'lsof -p 6379 | wc -l'