自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

04stone37

日积月累

  • 博客(24)
  • 收藏
  • 关注

原创 Native transports

介绍  Netty Native用C++编写JNI调用的Socket Transport,与JDK的NIO相比,GC更少,性能更高。Netty Native高性能Netty的 epoll transport使用 edge-triggered 而 JDK NIO 使用 level-triggered;更少GC,更少synchronized;暴露了更多的Socket配置参数,见E

2018-01-31 20:29:49 683

原创 Netty之更高效的计数器

import java.util.concurrent.atomic.AtomicLongFieldUpdater;/** * 类说明:内存节约型计数器 * * @author ruipeng.lrp * @since 2018/1/31 **/public class MemoryEffectiveCounter { private static final AtomicLo

2018-01-31 18:50:29 362

转载 Netty之引用计数器

转载:http://calvin1978.blogcn.com/articles/netty-leak.html引用计数器的必要性  在内存池的场景中,ByteBuf不再使用时需要主动归还给内存池;引用计数器相关知识ByteBuf被创建时,引用计数的初始值为1;调用release(),计数器减1,当计数器等于零时, deallocate()被调用,回收资源;调用release()或者retai

2018-01-31 16:59:16 464 1

原创 Netty的Future机制

Future与Promise类继承关系  如下图所示,Netty Future在JDK Future基础上,新增监听器功能;Netty Promise在Netty Future基础上新增设置成功和失败的功能。 Future的本质get():利用Object的wait()方法阻塞;cancel():利用Object的notifyAll(0方法唤醒线程;

2018-01-31 14:09:30 1365

转载 在Linux下判断系统当前是否开启了超线程

转载:http://www.lenky.info/archives/2012/03/1343在判断当前是否开启了超线程之前,需要先判断另外几个数据: 数据1:物理CPU个数:cat /proc/cpuinfo | grep "physical id" | sort | uniq 数据2:每个物理CPU的逻辑核数:cat /proc/cpuinfo | grep "cores" | uniq数据3:

2018-01-30 17:38:55 253

原创 Linux基础之中断

中断概念  中断是指CPU在执行过程中,出现了某些优先级更高的事件需要处理,暂停当前正在执行的程序,转去处理突发事件,处理完之后返回原程序位置继续执行,如下图所示。这些紧急事件一般指各种硬件设备,如磁盘、网卡、键盘和串口等。     中断的实现基于APIC芯片:硬件设备向IO APIC(总控中断控制器)发送信号,由IO APIC分发请求给各CPU处理。 基于MSI/MSI-X机

2018-01-29 21:09:45 621

原创 网卡中断占用CPU过高问题排查

排查过程通过top命令查看hi/si(硬件中断/软中断占用CPU百分比)是否过高;通过/proc/interrupts 查看系统中断信息,看网卡中断是否过高;如果CPU不均衡(某个CPU中断很高、其它正常),需要开启RPS/RFS或者RSS;

2018-01-29 15:47:43 4044

原创 Linux基础之网卡

基础命令查看网卡型号: lspci | grep -i ether; 查看网卡资源使用情况: sar -n DEV(重点看网络带宽); 查看网卡eth0的队列:/sys/class/net/eth0/queues; 查看网卡是否支持多队列: lspci -vvv | grep -i msi-x;   如下图所示,查看Ethernet controller的条目内容,如果有MSI-X &

2018-01-29 15:05:21 627

原创 Netty之TCP参数设置

TCP_NODELAY  解释:是否启用Nagle算法,改算法将小的碎片数据连接成更大的报文来最小化所发送的报文的数量。   使用建议:如果需要发送一些较小的报文,则需要禁用该算法,从而最小化报文传输延时。只有在网络通信非常大时(通常指已经到100k+/秒了),设置为false会有些许优势,因此建议大部分情况下均应设置为true。SO_LINGER  解释: Socket参数,关

2018-01-28 12:13:24 12293

原创 Too many open files问题排查

原因:进程打开的文件数/Socket连接数超过了系统设置的上限; 统计进程打开的文件数: lsof | grep [pid] | wc -l; 查看进程能够打开文件数的上限: cat /proc/[pid]/limits,max open files即为进程可打开的文件数上限; 修改文件上限:   方法1:启动脚本里通过ulimit主动复制,如ulimit -n 65535;   方法2

2018-01-27 10:25:45 680

原创 FastThreadLocal

ThreadLocalThreadLocal读写过程:   1. 获取当前线程的ThreadLocalMap,即Entry数组;   2. 根据ThreadLocal变量的哈希值确定槽位slot;   3. 若发生哈冲突则依次向后遍历数组直至不再冲突; 优点:节省空间,数组空间利用率高; 缺点:发生冲突时会线性遍历数组,导致性能下降,不适用于一个线程存在多个ThreadL

2018-01-26 19:19:37 368

原创 ThreadLocal解读

适用场景  线程级别的变量,适用于变量在线程间隔离而在方法或者类间共享的场景。基础原理 强引用链路:Thread –> ThreadLocalMap –> Entry –> Object。内存泄露问题: 如上图所示,ThreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal没有外部强引用引用他,那么系统g...

2018-01-26 18:43:34 246

原创 业务线程与IO线程的隔离

线程模型 隔离的好处:职责明确化。IO线程只负责IO的读写、编解码和心跳等简单功能,以便及时高效处理IO事件;业务线程负责复杂的业务处理;降低客户端间的相互影响。对于同一IO线程,避免了由于执行客户端A的请求阻塞而无法接受客户端B的请求等现象;

2018-01-23 21:05:18 3689 3

原创 自适应流控方案

入口流控自适应方案问题:在Netty中引入业务线程池带来的问题就是速率不匹配,如果IO线程接受数据的速度超过业务线程的处理速度,就会出现缓冲队列溢出,此时需要能够对客户端的发送速率进行控制。  如下图所示,提供了一种基于TCP Flow-Control机制的自适应流控方案。当缓冲区溢出时,服务端会按一定的规则选取出最消耗业务线程资源的客户端,然后将客户端对应连接的auoread属性设置为f

2018-01-23 14:28:40 904

原创 writeAndFlush之发送速率不匹配

背景知识如果业务线程调用writeAndFlush()发送消息,会生成WriteAndFlushTask,交由IO线程处理,write操作将消息写入ChannelOutboundBuffer,flush操作将ChannelOutboundBuffer写入socket的发送缓冲区;ChannelOutboundBuffer是单向链表,没有容量限制;速率不匹配造成的问题  如下图所示,当业务线程产

2018-01-21 17:48:22 3662 3

原创 TCP的状态机

TCP的状态机

2018-01-20 19:58:34 263

原创 Load过高问题排查

情况1:CPU高、Load高通过top命令查找占用CPU最高的进程PID;通过top -Hp PID查找占用CPU最高的线程TID;对于java程序,使用jstack打印线程堆栈信息;通过printf %x tid打印出最消耗CPU线程的十六进制;在堆栈信息中查看该线程的堆栈信息;情况2:CPU低、Load高通过top命令查看CPU等待IO时间,即%wa;通过iostat -d -x

2018-01-20 19:27:15 1182

原创 Linux基础之系统负载Load

Load定义  日常查看负载的命令如top、updatime等都是从/proc/loadavg获得,其对load的定义如下:   The first three fields in this file are load average figures giving the number of jobs in the run queue (state R) or waiting for disk

2018-01-20 18:44:09 444

原创 TCP连接大量CLOSE_WAIT状态问题排查

CLOSE_WAIT产生原因  close_wait是被动关闭连接是形成的,根据TCP状态机,服务器端收到客户端发送的FIN,TCP协议栈会自动发送ACK,链接进入close_wait状态。但如果服务器端不执行socket的close()操作,状态就不能由close_wait迁移到last_ack,则系统中会存在很多close_wait状态的连接,如下图所示: 可能的原因如下:关闭...

2018-01-18 13:48:30 6094

原创 Netty网络处理之客户端主动关闭

TCP状态变化  应用层及时关闭连接:ESTABLISHED –> CLOSE_WAIT –> LAST_ACK –> CLOSED;   应用层未在指定时间内关闭连接:ESTABLISHED –> CLOSE_WAIT –> CLOSED; Netty处理过程  TCP状态进入CLOSE_WAIT时会产生OP_READ事件通知应用层,Netty从socket读取数据时返回-1,close被设为

2018-01-18 09:54:43 23829 2

原创 TCP连接大量TIME_WAIT状态问题排查

TIME_WAIT连接过多TIME_WAIT的产生  TIMEWAIT是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接时产生的。TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的。服务器在处理客户端请求的时候,如果你的程序设计为服务器主动关闭,那么你才有可能需要关注这个TIMEWAIT状态过多的问题。如果你的服务器设计为被动关闭,那么你首先要关

2018-01-17 19:14:41 3304

原创 Netty网络处理之客户端宕机

客户端宕机时的网络处理流程客户端的应用进程挂掉时,其所在操作系统会清理进程绑定的资源,关闭连接时产生RST信号,通知对端;服务端接受到信号后,IO复用模型如Epoll产生读事件;应用进程通过Selector多路复用器感知到读事件,产生OP_READ;IO线程从对应的连接中读取数据,抛出IOException;首先,触发exceptionCaught方法,处理异常;其次,触发ch

2018-01-16 11:25:09 1427

原创 系统假死问题排查

系统假死定义  应用进程存在,但是无法正常提供服务(请求没有响应,或者响应超时)。系统假死原因  主要分为两大类:连接无法建立、请求无法处理,如下图所示: 连接数达到上限查看单个进程能打开的最大句柄数,如果太小需要进行修改; 查看:ulimit -a 修改:vi /etc/security/limits.conf统计各状态的连接数量 netstat -n | awk '/^tcp/ {+

2018-01-16 10:10:43 2348

原创 EventExecutor筛选策略

背景:一个EventExecutorGroup由多个EventExecutor组成,每次从EventExecutorGroup中获取EventExecutor的逻辑由EventExecutorChooser决定,主要有两种策略。实现逻辑  首先判断数组容量是否为2的幂次方,若是,通过位运算提高计算效率。编程技巧:2的幂次方的判断;取余时,整数溢出时的考虑与处理;import java.util

2018-01-02 15:23:29 638 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除