压测短链接项目的时候,由 Jmeter 报错:java.net.BindException:Address already in use,所引发的一系列困惑与思考

压测短链接项目的时候,由 Jmeter 的一个报错,所引发的一系列困惑与思考

踩过的坑:
1、压测短链接跳转接口的时候,不要勾选重定向,不然接口的响应时间、吞吐量测得不准确,而且压测过多,会被网站风控,ip 会被禁掉
压测短链接项目的时候,由 Jmeter 报错:java.net.BindException:Address already in use,所引发的一系列困惑与思考_第1张图片

2、Jmeter 报错:java.net.BindException:Address already in use.
解决方案,可以看这篇博客,总结的很好。https://blog.csdn.net/wxf_csdn/article/details/103035979?spm=1001.2014.3001.5502
一开始自己没有想明白,把进程的进程 id 和端口号搞混了,一直以为发送的 Tcp 包的源端口号必须和进程的进程id 一样,越想越觉得不对劲,后来通过查阅资料,才发现自己想错了,进程和端口号根本没有什么联系,就是客户端与服务端网络通信发送 Tcp 包的时候,需要一个源端口号,操作系统就随机生成一个,等网络通信结束了,这个端口号就不用了,可以被其他 Tcp 连接使用了。

事情的起因是最近我在写一个短链接系统,快写完了,想着压测一下短链接的跳转接口,使用 Jmeter 压测的时候,报了一个错误:java.net.BindException:Address already in use.

报错的原因是因为并发的连接太多了,端口号不够用了。

如果想要再往深层次挖掘的话,就是计算机网络的知识了,我们在 Jmeter(应用层) 发起一个 Http 请求,需要先建立 Tcp 连接,其实就是在应用层创建一个 Socket,实现客户端和服务端的网络通信。

至于 Socket 是什么,这里简单解释一下,可以理解成是操作系统将计算机网络底层数据的传输、数据包的封装等逻辑封装起来了,封装成了一套系统调用 API 给应用层使用。

怎么确立一个 Socket 连接呢,是通过四元组来标识的,四元组包括:源 ip、源端口号、目的 ip、目的端口。四个元素,只要有一个元素不一样,Socket 就可以建立了。

源 ip、目的 ip 好说,目的端口呢,如果客户端访问的是 Web 服务,一般就是 80 端口。
那么源端口号怎么生成呢?默认是操作系统随机生成的,最多 65535 个。

Tcp 连接的主动断开方需要等待 2 MSL 的时间,在TIME_WAIT状态下,该端口号在短时间内不会被重新分配给其他TCP连接使用,那么高并发压测的时候,端口号可能就不够用了

这也就是为什么,并发压测的线程过多的时候,Jmeter 会报端口号不足的错误了。

那么为什么主动断开 Tcp 连接方需要等待 2 MSL 的时间呢?系统中出现大量的TIME_WAIT状态的连接,有什么危害呢?怎么处理呢?
可以看以下的文章,讲的不错。
https://cloud.tencent.com/developer/article/2096806
https://cloud.tencent.com/developer/article/1589962
https://zhuanlan.zhihu.com/p/415307243

这里在总结一下 Socket,建立一个 Socket、一个 Tcp 连接,操作系统会在内核中开辟资源,会有一个接收队列,发送队列,说是网络通信,其实应用程序还是将数据拷贝到本地的队列中,然后再由网卡发送出去,接收方也同理。

越学越觉得计算机基础知识的重要性了,操作系统、计算机网络等,必须要融会贯通,学习知识、理解解决问题的时候才没有思维上的困惑、阻塞。
自己从零到一构思设计一个系统,写代码写出一个系统,争取把代码写好,把功能实现好。会不断的遇到问题,解决问题,在这个过程中反反复复,会感觉到自己的能力得到了很大的提高。

你可能感兴趣的:(短链接系统,jmeter,java)