线程状态

最近在排查一个多线程的问题,dump 内存的时候,发现很多线程状态的问题。虽然线程状态已经看了很多,但是还是需要重新梳理一下。多线程问题,没有小问题,需要基础知识牢固,概念清晰,才好入手。 Java线程的六种状态以及切换 1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统 … 继续阅读

阻塞和非阻塞&同步和异步的伪代码

在Medium上看到一个非常棒的用来描述各种IO模型的伪代码,这些例子很好地展示了阻塞非阻塞、同步和异步的特点。 常见的I/O 类型 Blocking Non-blocking Asynchronous API write, read write, read + poll / select aio_write, aio_read 以读操作为例,不同的IO模型。对象和函数都是抽象的: Followi … 继续阅读

性能瓶颈分析

整理和总结一些常见的性能瓶颈分析思路和工具。 CPU分析 当程序响应变慢的时候,首先使用top、vmstat、ps等命令查看系统的cpu使用率是否有异常,从而可以判断出是否是cpu繁忙造成的性能问题。其中,主要通过us(用户进程所占的%)这个数据来看异常的进程信息。当us接近100%甚至更高时,可以确定是cpu繁忙造成的响应缓慢。一般说来,cpu繁忙的原因有以下几个: 线程中有无限空循环、无阻塞、 … 继续阅读

性能指标

系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。 单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。 系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间 QPS(TPS):每秒钟request/事务 数量 (很多人经常会把并发数和TPS理解混淆) 并发数: 系统同时处理的request … 继续阅读

Netty中的零拷贝

最近看了一些netty的文章,对操作系统零拷贝和netty的零拷贝起了点兴趣,于是整理了相关的知识。 操作系统的零拷贝 传统的零拷贝指的是数据传输过程中,不需要CPU进行数据的拷贝。主要是数据在用户空间与内核中间之间的拷贝。 操作系统的零拷贝,这种方式需要四次数据拷贝和四次上下文切换: 1. 数据从磁盘读取到内核的read buffer 2. 数据从内核缓冲区拷贝到用户缓冲区 3. 数据从用户缓冲 … 继续阅读