Java Socket编程基础

1. Java Socket:如何基于sokcet实现server

 

服务器通讯模型:

在这个过程中,socket是怎么建立连接和关闭连接的呢,这里面大概的来看一下,tcp的三次握手和四次挥手相关原理。

TCP/IP的三次握手和四次挥手概念介绍:

1. https://blog.csdn.net/qq_38950316/article/details/81087809

2. https://www.cnblogs.com/AhuntSun-blog/p/12028636.html

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:

I/O模型的发展历史: 

        线程池 -> EDA -> SEDA

 

4.Netty框架基础

Netty的优点

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值