1. Java Socket:如何基于sokcet实现server
服务器通讯模型:
在这个过程中,socket是怎么建立连接和关闭连接的呢,这里面大概的来看一下,tcp的三次握手和四次挥手相关原理。
TCP/IP的三次握手和四次挥手概念介绍:
1. https://blog.csdn.net/qq_38950316/article/details/81087809
socket 3种接入处理方式:
单线程处理:GC处理速度正常,但是socket响应时间过长,整体吞吐量小
每次申请一个线程处理:socket响应速率提高,吞吐量增大但是每次请求创建一个线程GC的次数大大增加
固定线程池处理:socket响应速率极快,吞吐量很高,同时GC触发次数也很少。
wrk压测工具介绍
压测工具,我的电脑上用的是mac安装方式如下:
# 用brew下载,brew的安装方式自行百度
brew install wrk
# 安装成功以后查找wrk安装目录
brew list wrk
# 这是我mac上的安装路径
/usr/local/Cellar/wrk/4.1.0/bin/wrk
# 压测命令
cd /usr/local/Cellar/wrk/4.1.0/bin
./wrk -t2 -c40 -d30s http://localhost:8001 --latency
# 参数介绍
-t:启动线程数,一般为cpu核*2,可以根据IO或cpu密集型进行调整
-c: 并发数,平分到每个线程中,熟练不能大于可以用TCP端口数
-d: 持续请求时间
--latency:显示延时分布
#响应如下
Running 30s test @ http://localhost:8803
2 threads and 40 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.99ms 33.42ms 968.61ms 99.60%
Req/Sec 1.52k 1.10k 3.82k 61.54%
Latency Distribution
50% 1.14ms
75% 1.56ms
90% 1.80ms
99% 3.56ms
18110 requests in 30.07s, 2.37MB read
Socket errors: connect 40, read 69943, write 6, timeout 1
Requests/sec: 602.27
Transfer/sec: 80.81KB
# 响应参数介绍
Latency:响应时间
Req/Sec:单个线程处理请求数
Avg:平均值
Stdev:标准差,值越大说明数据分布均匀,可能是机器或服务性能不稳定导致。
Max:最大值
+/- Stdev:正负标准差比例,差值比标准差大或小的数据比率
Latency Distribution:延时分布多少ms一下请求数比例
Requests/sec:平均每秒处理请求数
Transfer/sec:平均每秒传输数据量
压测结果
对比30压测数据如下图:
并行GC | 响应速率 | GC次数 | 传输率 |
单线程处理 | 655.50 | 63次 | 324.85KB |
每次开辟线程处理 | 886.90 | 2908次 | 245.02KB |
线程池管理 | 972.38 | 12次 | 250.97KB |
CMSGC | 响应速率 | GC次数 | 传输率 |
单线程处理 | 559.68 | 39次 | 281.86KB |
每次开辟线程处理 | 781.79 | 2491次 | 209.70KB |
线程池管理 | 614.40 | 5次 | 79.42KB |
G1GC | 响应速率 | GC次数 | 传输率 |
单线程处理 | 623.85 | 8次 | 176.82KB |
每次开辟线程处理 | 968.72 | 192次 | 265.34KB |
线程池管理 | 1867.28 | 10次 | 299.64KB |
结论:
1. 运行效率来看整体上来说线程池->线程处理->单线程处理;
2. 在提高内存的情况下,GC算法运行效率的排序 G1GC >并行GC > CMGC,但是从性能稳定上来说 G1GC > CMSGC > 并行GC
2. 深入IO:Server处理时到底做了什么
3.IO模型与相关的概念
通信模型
BIO: Blocking I/O
NIO: Non Blocking I/O
多路复用I/O
早期的多路复用存在的缺点和优化方式:
零拷贝概念: epoll支持用户内核和系统内存共享一片内存区,直接进行数据交互,取消了之前系统设计的需要通过系统内核将数据拷贝到用户内核的过程。
信号驱动I/O
异步I/O:![](https://i-blog.csdnimg.cn/blog_migrate/9162f54f60e2c351a2c90a38cd4b7ba2.png)
I/O模型的发展历史:
线程池 -> EDA -> SEDA
4.Netty框架基础
Netty的优点