当前位置: 首页 > news >正文

时尚大气的网站设计临汾网站建设 吕梁网站建设

时尚大气的网站设计,临汾网站建设 吕梁网站建设,注册网站需要备案吗,外贸网站外链平台目录 前言阅读对象阅读导航笔记正文一、如何选择序列化框架1.1 基本介绍1.2 在网络编程中如何选择序列化框架1.3 常用Java序列化框架比较 二、Netty调优2.1 CONNECT_TIMEOUT_MILLIS#xff1a;客户端连接时间2.2 SO_BACKLOG#xff1a;最大同时连接数2.3 TCP_NODELAY#xf… 目录 前言阅读对象阅读导航笔记正文一、如何选择序列化框架1.1 基本介绍1.2 在网络编程中如何选择序列化框架1.3 常用Java序列化框架比较 二、Netty调优2.1 CONNECT_TIMEOUT_MILLIS客户端连接时间2.2 SO_BACKLOG最大同时连接数2.3 TCP_NODELAY关闭TPC网络传输优化Nagle算法2.4 SO_SNDBUF SO_RCVBUFTCP层面的缓存大小2.5 ALLOCATOR内存分配器2.6 RCVBUF_ALLOCATOR入站内存分配器 三、Netty面试题3.1 Netty如何解决空轮询BUG3.2 如何单机下支持百万连接3.2.0 硬件层面支持3.2.1 OS层面支持1.2.2 Netty层面支持3.2.3 JVM层面支持 学习总结感谢 前言 很直接哈最近去面试的时候遇到了一些Netty网络编程序列化框架上的问题当时回答的不是很好所以赶紧回来学习了一下顺便做一下笔记沉淀一下了。 阅读对象 熟悉网络编程熟悉Netty基本应用想要了解序列化框架选择思路想要了解Netty参数优化 阅读导航 系列上一篇文章《【Netty专题】用Netty手写一个远程长连接通信框架》 笔记正文 一、如何选择序列化框架 1.1 基本介绍 什么是序列化/反序列化我在前面的文章中有提到过但那时候没有写的很仔细我自己也忘了罪过啊。其实我知道序列化/反序列化在网络编程中是很重要的概念只不过被我自己疏忽了。 言归正传。 什么是序列化、反序列化 我们知道数据在网络中传输不可能是原文传输的人家机器设备只认得二进制01串。所以把原文转换为01串字节流这个过程就是序列化反之则叫做反序列化 序列化有什么作用 主要目的有【网络传输】及【对象持久化保存】。持久化保存知道啥意思吧就是存到各种数据库中 感兴趣的朋友可以看这篇文章《给我5分钟一次性给你讲明白Java中的序列化和反序列化》学习一下。 1.2 在网络编程中如何选择序列化框架 市面上有很多序列化工具如 原生的JDK序列化ProtoBuffKryoThriftAvro 那我们在编程中如何选择呢正常来说我们需要从以下4个维度做比较 语言支持是否支持当前项目使用语言比如原生的JDK序列化框架只支持Java我要是C项目不可能使用JDK序列化框架吧空间效率序列化后占用的空间时间效率序列化/反序列化的速度易用性使用是否友好、便捷 是的正常来说就是需要通过以上4个维度考虑。综合考虑后再决定选用什么样的序列化框架 1.3 常用Java序列化框架比较 来自阿里开发者社区的一个Java序列化框架比较几种Java常用序列化框架的选型与对比 跨语言来说 结论Protobuf在通用上是最佳的能够支持多种主流变成语言。 易用性来说 结论JDK Serializer外的序列化框架都提供了不错API使用方式 可扩展性来说 结论下面是各个序列化框架的可扩展性对比可以看到Protobuf的可扩展性是最方便、自然的。其它序列化框架都需要一些配置、注解等操作。 性能来说空间、时间 结论对比各个序列化框架序列化后的数据大小如下可以看出kryo preregister(预先注册序列化类)和Avro序列化结果都很不错。所以如果在序列化大小上有需求可以选择Kryo或Avro。 结论下面是序列化与反序列化的时间开销kryo preregister和fst preregister都能提供优异的性能其中fst pre序列化时间就最佳而kryo pre在序列化和反序列化时间开销上基本一致。所以如果序列化时间是主要的考虑指标可以选择Kryo或FST都能提供不错的性能体验。 数据类型和语法结构支持 二、Netty调优 Netty的调优参数有很多感兴趣的朋友可以去看看Netty包下的 io.netty.channel.ChannelOption类里面。在这里只是简单介绍一下Netty常用调优参数。 PS下面参数的主要释义来自于【百度-文心一言】 2.1 CONNECT_TIMEOUT_MILLIS客户端连接时间 CONNECT_TIMEOUT_MILLIS参数的作用是设置客户端连接超时时间默认值20秒。这个参数用于定义客户端在尝试连接到服务器时可以等待的最大时间。如果在这段时间内无法建立连接Netty将抛出一个连接超时的异常。 修改设置方式是使用Bootstrap的option方法。如下 在服务端设置了如果客户端在发起连接后的5秒如果仍未连接成功则抛出异常。 2.2 SO_BACKLOG最大同时连接数 Netty中的SO_BACKLOG参数主要用于TCP协议它定义了操作系统内核应为此套接字排队的最大传入连接数。当新连接到达且套接字已达到其最大容量时操作系统内核将根据这个参数的值决定如何处理新连接。 具体来说如果SO_BACKLOG的值较大那么当套接字已达到其最大容量时操作系统内核将会暂时存储在队列中等待处理的新的连接。如果SO_BACKLOG的值较小那么当套接字已达到其最大容量时操作系统内核将会拒绝新的连接请求并向客户端返回一个错误信息告诉它连接请求被拒绝。 因此通过合理地设置SO_BACKLOG的值我们可以控制Netty应用程序能够同时处理的最大连接数。这在进行网络编程时非常重要尤其是当我们需要处理大量并发连接时。 window的默认值是200linux和mac的128如果配置文件存在以配置为准。 修改示例如下 2.3 TCP_NODELAY关闭TPC网络传输优化Nagle算法 Netty中的TCP_NODELAY参数主要用于关闭Nagle算法。Nagle算法是一种改善网络性能的算法它通过将小的数据包组装为更大的帧进行发送以减少网络中的数据包数量。但是这种算法可能会导致数据传输的延迟。 所以TCP_NODELAY参数的作用就是关闭Nagle算法禁用Nagle算法因此适用于小数据即时传输。它的默认值为true如果需要发送一些较小的报文则需要禁用该算法设置为false。 PS如果你不在意这些带宽消耗更在意传输效率那么关闭它 修改示例代码如下 2.4 SO_SNDBUF SO_RCVBUFTCP层面的缓存大小 我在标题中特意注明了这是TCP传输层面的缓存大小这是因为缓存思想在很多地方都用到了比如NIO/Netty等都自己封装了一层应用层级的缓存。 下面是【文心一言】的答案但是感觉怪怪的 Netty中的SO_SNDBUF和SO_RCVBUF参数主要用于设置TCP发送和接收缓冲区的大小。 SO_SNDBUF是发送缓冲区的大小用于限制系统为此套接字排队的最大待发送字节数。如果应用程序尝试发送超过这个缓冲区大小的字节系统将会阻塞或返回错误。SO_RCVBUF是接收缓冲区的大小用于限制系统为此套接字排队的最大待接收字节数。如果应用程序接收到的数据超过这个缓冲区的大小那么数据将会被丢弃。 通过合理地设置这两个参数我们可以控制Netty应用程序的TCP发送和接收性能以及防止因缓冲区溢出而导致的数据丢失或程序阻塞。 需要注意的是发送缓冲区和接受缓冲区都是SocketChannal的参数SO_RCVBUF也可以用于ServerSocketChannel参数。理论上不建议自己调整因为操作系统会自动根据网络流量来调整大小。 2.5 ALLOCATOR内存分配器 这个参数略显复杂也算是比较重要吧。 首先这里配置的其实就是ByteBuf分配器有了分配器就可以创建ByteBufctx.alloc()。这个参数决定了分配的buf是【池化】还是【非池化】是【直接内存】还是【堆内存】。 然后这个分配器有一个很有意思的设置 该参数默认值是由系统类型决定的不过可以通过命令行Dio.netty.allocator.type修改可修改值为unpooled和pooled如果没有设置默认按照系统类型。安卓系统则是unpooled其他则为pooled 哈哈这个默认设置逻辑不知道是不是因为安卓系统小内存比较多 然后就是默认为使用直接内存所谓直接内存即堆外内存反之也有堆内存。当然也可以通过命令函参数Dio.netty.noPreferDirect修改值分别为true跟false默认为false 2.6 RCVBUF_ALLOCATOR入站内存分配器 这个跟上面的参数比较相似只不过RCVBUF_ALLOCATOR是设置入站数据缓存的分配。不同于上面的这里在内存方面强制使用【直接内存】策略没有【堆内存】可选。这是因为Netty零拷贝需要。如果被设置为【堆内存】了则又多了一次拷贝过程。 最后它的【池化】【非池化】则由ALLOCATOR参数决定跟随ALLOCATOR参数。 三、Netty面试题 3.1 Netty如何解决空轮询BUG 在JDK NIO里面有一个BUG就是臭名昭著的空轮询。它的现象就是多路复用器Selector会突然醒来然后进行轮询socket然而此时并没有任何事件进来导致CPU飙升至100%进而进程崩溃。 据JDK反馈这是linux内核的BUG不是我的问题你们别瞎说。所以JDK没有做什么处理也就是放任这个BUG没管 然后体贴的Netty为了让我们免于这个烦恼用了一个很简单粗暴的方式解决空论询统计周期时间T内空轮训次数N若达到一定阈值则认为触发了空轮询BUG然后重建Selector重新注册SocketChannel。 3.2 如何单机下支持百万连接 单机支持百万连接需要做不少工作甚至包括OS层面。 3.2.0 硬件层面支持 当然啦需要一定层面的硬件支持你想在1G2核的机器下做百万连接还是有点难度的。 3.2.1 OS层面支持 在 Linux 平台上无论编写客户端程序还是服务端程序在进行高并发 TCP 连接处理时最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制这是因为系统为每个 TCP 连接都要创建一个 socket 句柄每个 socket 句柄同时也是一个文件句柄。 Linux系统下可使用ulimit命令查看系统允许当前用户进程打开的句柄数限制默认情况下最多支持1024个。 所以对于想支持更高数量的 TCP 并发连接的通讯处理程序就必须修改 Linux 对当前用户的进程同时打开的文件数量。修改单个进程打开最大文件数限制的最简单的办法就是使用 ulimit 命令$ ulimit –n 1000000 如果系统回显类似于Operation not permitted之类的话说明上述限制修改失败实际上是因为在中指定的数值超过了 Linux 系统对该用户打开文件数的软限制或硬限制。因此就需要修改 Linux 系统对用户的关于打开文件数的软限制和硬限制。 软限制 soft limit : 是指 Linux 在当前系统能够承受的范围内进一步限制一个进程同时打开的文件数 硬限制 hardlimit : 是根据系统硬件资源状况主要是系统内存计算出来的系统最多可同时打开的文件数量。 第一步 修改/etc/security/limits.conf文件在文件中添加如下行 # *号表示修改所有用户的限制 * soft nofile 1000000 * hard nofile 1000000soft 和 hard 为两种限制方式其中 soft 表示警告的限制hard 表示真正限制nofile表示打开的最大文件数。1000000 则指定了想要修改的新的限制值即最大打开文件数请注意软限制值要小于或等于硬限制。修改完后保存文件。 第二步 修改/etc/pam.d/login文件在文件中添加如下行 session required /lib/security/pam_limits.so这是告诉 Linux 在用户完成系统登录后应该调用 pam_limits.so 模块来设置系统对该用户可使用的各种资源数量的最大限制包括用户可打开的最大文件数限制而 pam_limits.so模块就会从/etc/security/limits.conf 文件中读取配置来设置这些限制值。修改完后保存此文件。 第三步 查看 Linux 系统级的最大打开文件数限制使用如下命令cat /proc/sys/fs/file-max 修改这个系统最大文件描述符的限制修改sysctl.conf文件vi /etc/sysctl.conf # 在末尾添加 fs.file_max 1000000接着sysctl -p表示立刻生效 1.2.2 Netty层面支持 第一步设置合理的线程数 线程方面的调优其实主要就是集中在Netty的Boss跟WorkerEventLoop上了。BossEventLoop即所谓Reactor模型中的Accpetor线程池WorkerEventGroup即所谓的Reactor线程池。 对于 Nety 服务端通常只需要启动一个监听端口用于端侧设备接入即可但是如果服务端集群实例比较少甚至是单机(或者双机冷备)部署在端侧设备在短时间内大量接入时需要对服务端的监听方式和线程模型做优化以满足短时间内(例如 30s)百万级的端侧设备接入的需要。 服务端可以监听多个端口利用主从 Reactor 线程模型做接入优化前端通过 SLB 做 4 层门 7 层负载均衡。 主从 Reactor 线程模型特点如下服务端用于接收客户端连接、处理客户端IO事件的线程不再一条现成而是一个NIO线程池。正常来说是两组Reactor线程池即MainReactor和SubReactor。前者主要是处理客户端连接业务后者接收IO读写业务。 对于 IO 工作线程池的优化可以先采用系统默认值(即 CPU 内核数×2)进行性能测试在性能测试过程中采集 IO 线程的 CPU 占用大小看是否存在瓶颈具体可以观察线程堆栈如果连续采集几次进行对比发现线程堆栈都停留在Selectorlmpl.lockAndDoSelect则说明IO线程比较空闲无须对工作线程数做调整如果发现 IO 线程的热点停留在读或者写操作或者停留在 Channelhandler 的执行处则可以通过适当调大 Nio EventLoop 线程的个数来提升网络的读写性能 附上一张主从Reactor多线程模型图 第二步心跳优化 1有效监测无效连接及时剔除避免占用系统句柄资源 2设置合理的心跳周期 3使用Netty提供的链路空闲检测机制不要自己创建定时任务线程池去做 第三步接收和发送缓冲区调优 在一些场景下端侧设备会周期性地上报数据和发送心跳单个链路的消息收发量并不大,针对此类场景可以通过调小 TCP 的接收和发送缓冲区来降低单个 TCP 连接的资源占用率 当然对于不同的应用场景,收发缓冲区的最优值可能不同用户需要根据实际场景结合性能测试数据进行针对性的调优 第四步IO 线程和业务线程分离 如果服务端不做复杂的业务逻辑操作仅是简单的内存操作和消息转发则可以通过调大NioEventLoop工作线程池的方式直接在IO线程中执行业务 Channelhandler这样便减少了一线程上下文切换性能反而更高。 如果有复杂的业务逻辑操作则建议 IO 线程和业务线程分离对于 IO 线程由于互相之间不存在锁竞争可以创建一个大的 NioEvent Loop Group 线程组所有 Channel 都共享同一个线程池。 对于后端的业务线程池则建议创建多个小的业务线程池线程池可以与 IO 线程绑定这样既减少了锁竞争又提升了后端的处理性能。 3.2.3 JVM层面支持 当客户端的并发连接数达到数十万或者数百万时系统一个较小的抖动就会导致很严重的后果。例如服务端的 GC会导致STWStop-The-World事件的发生严重的时候可能会导致程序几秒钟不工作这个在大并发的情况下是非常危险的。 JVM层面的调优主要在于【GC参数优化】毕竟GC参数设置不当会导致频繁GC甚至OOM异常对服务端的稳定运行产生重大影响。解决思路通常如下 1确定GC优化目标 GC有三个主要指标 吞吐量吞吐量是评价 GC 能力的重要指标在不考虑 GC 引起的停顿时间或内存消耗时吞吐量是 GC 能支撑应用程序达到的最高性能指标延迟STW时间GC 能力的最重要指标之一是由于 GC 引起的停顿时间优化目标是缩短延迟时间或完全消除停顿(STW)避免应用程序在运行过程中发生抖动内存占用GC 正常时占用的内存量 而对应过来JVM调优的三个基本原则如下 MinorGC回收原则每次新生代 GC 回收尽可能多的内存减少应用程序发生 Full gc 的频率GC 内存最大化原则垃圾收集器能够使用的内存越大垃圾收集效率越高应用程序越流畅。但是过大的内存一次 FullGC耗时比较长毕竟要扫描的地方也比较多了。所以就需要比较精细的调优了3 选 2 原则吞吐量、延迟和内存占用是不太能够兼得的无法同时做到吞吐量和暂停时间都最优需要根据业务场景做选择。总得来说对于大多数应用吞吐量优先其次是停顿时间 2确定服务端内存占用 在优化 GC 之前需要确定应用程序的内存占用大小以便为应用程序设置合适的内存提升 GC 效率。内存占用与活跃数据有关活跃数据指的是应用程序稳定运行时长时间存活的Java 对象。活跃数据的计算方式通过 GC 日志采集 GC 数据获取应用程序稳定时老年代占用的 Java 堆大小以及永久代(元数据区)占用的 Java 堆大小两者之和就是活跃数据的内存占用大小 3GC优化过程 GC数据的采集和分析设置合适的JVM堆大小选择合适的垃圾回收器和回收策略 当然具体如何做请参考 JVM 相关课程。而且 GC 调优会是一个需要多次调整的过程期间不仅有参数的变化更重要的是需要调整业务代码 学习总结 学习了Netty常用的调优参数学习了序列化框架选择思路 感谢 感谢【智云科技】的文章《给我5分钟一次性给你讲明白Java中的序列化和反序列化》 感谢本站大佬【作者卒获有所闻】的文章《Netty序列化算法参数调优》
http://www.dnsts.com.cn/news/106105.html

相关文章:

  • 网站开发软件排行榜wordpress设定域名
  • 西安网站优化培训小说推文万能关键词
  • 专门做潮搭的网站网站建设灬金手指下拉十五
  • 贵阳建筑公司网站建设做跨境网站
  • 360网站建设价位那样的网站18年
  • 哪家高端网站建设好理财平台网站建设
  • 文明校园建设专题网站目前最好用的云电脑排行
  • 清丰网站建设公司辽宁省建设工程信息网如何传业绩
  • 网站辅助导航网站平台开发报价单
  • 检察机关门户网站建设亚购物车功能网站怎么做的
  • 网站设计三原则wordpress 菜单图标
  • 湛江企业建站程序做网站资料
  • 学校网站建设说明网站建设与管理的体会
  • 网站开发软件中文版微信公众号制作平台
  • 有哪些商业网站未备案运行网站
  • 网站设计资料9国产精华最好的产品
  • 梅州做网站需要多少钱做网站自己买服务器
  • 网站的模板百度广告推广费用年费
  • 龙泉驿建设局网站wordpress模块修改
  • 企业网站开发职责做网赌网站需要多少钱
  • 网页的创新型网站策划佛山网页制作公司
  • 辽宁建网站哪做网站比较便宜
  • 温岭网站设计学校网站手机站的建设方案
  • 上海优化排名公司班级优化大师网页版
  • 辽阳企业网站建设价格惠州seo博客报价
  • 网站官网怎么做全球搜索网站排名
  • 手机网站后台模板领导不愿意做招聘网站怎么办
  • 网站建设维护面试题小说阅读网站系统模板下载
  • 中企动力做网站的优势wordpress熊掌号文章提交
  • 广元 网站建设wordpress加入百度统计