1 Star 0 Fork 4

13373613629/netty_io_udp_tcp_websocket

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
优化.txt 1.78 KB
一键复制 编辑 原始数据 按行查看 历史
z17097201102 提交于 2021-02-24 06:49 . netty使用优化建议
Netty的零拷⻉主要体现在三个⽅⾯:
Bytebuf 使⽤的是⽤池化的Direct Buffer类型使⽤的堆外内存,不需要进⾏字节缓冲区的⼆次拷
⻉,如果使⽤堆内存, JVM会先拷⻉到堆内,再写⼊Socket,就多了⼀次拷⻉。
CompositeByteBuf将多个ByteBuf封装成⼀个ByteBuf,在添加ByteBuf时不需要进程拷⻉。
Netty的⽂件传输类DefaultFileRegion的transferTo⽅法将⽂件发送到⽬标channel中,不需要进
⾏循环拷⻉,提升了性能。
2使⽤EventLoop的任务调度
channel.eventLoop().execute(new Runnable() {
@Override
public void run() {
channel.writeAndFlush(data)
}
});
在writeAndFlush的底层,如果没有通过eventLoop执⾏的话,就会重新启动新的线程执⾏。
3:减少pipeline的调用长度
// BAD (most of the times)
ctx.channel().writeAndFlush(msg);
// GOOD
ctx.writeAndFlush(msg);
4:减少ChannelHandler的创建
如果channelhandler是⽆状态的(即不需要保存任何状态参数),那么使⽤
@ChannelHandler.Sharable注解,并在
bootstrap时只创建⼀个实例,减少GC。否则每次连接都会new出handler对象。
5:一些配置参数的设置
ServerBootstrap启动时,通常bossGroup只需要设置为1即可,因为ServerSocketChannel在初始化阶
段,只会注册到某⼀个eventLoop上,⽽这个eventLoop只会有⼀个线程在运⾏,所以没有必要设置为
多线程。⽽ IO 线程,为了充分利⽤ CPU,同时考虑减少线上下⽂切换的开销,通常设置为 CPU 核数的
两倍,这也是 Netty 提供的默认值。
在对于响应时间有⾼要求的场景,使⽤
serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true)
和.option(ChannelOption.TCP_NODELAY, true)来禁⽤nagle算法,不等待,⽴即发送
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/hollybird_admin/tcp.git
git@gitee.com:hollybird_admin/tcp.git
hollybird_admin
tcp
netty_io_udp_tcp_websocket
master

搜索帮助