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'