本章主要介绍了生产者和消费者模式进行并发编程、线上问题排查手段和性能测试实战。
生产者和消费者模式
生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通信,而是通过阻塞队列来进行通信。这个阻塞队列就是用来给生产者和消费者解耦的。
1 | /** |
线上问题定位
有时候,有很多问题只有在线上或者预发环境才能发现,而线上又不能调试代码,所以线上问题定位就只能看日志、系统状态和dump线程。
先用top命令找出CPU占比最高的
ps -ef或者jps进一步定位进程
定位到具体线程或代码
[案例] 1
2
3
4# -m 显示所有的线程
# -p pid 进程使用cpu的时间
# -o 该参数后是用户自定义格式
$ ps -mp 进程 -o THREAD,tid,time、将需要的线程ID转换为16进制格式(英文小写格式)
[案例] 1
2
3
4dump出来的线程ID(nid)是十六进制的,而我们用TOP命令看到的线程ID是十进制的,
所以要用printf命令转换一下进制。然后用十六进制的ID去dump里找到对应的线程。
$ printf "%x\n" 31558
输出:7b46。定位异常代码块
[案例] 1
2$ jstatck 进程ID | grep tid(16进制线程ID小写英文)-A60
输出:异常代码块
性能测试
因为要支持某个业务,有同事向我们提出需求,希望系统的某个接口能够支持2万的QPS,因为我们的应用部署在多台机器上,要支持两万的QPS,我们必须先要知道该接口在单机上能支持多少QPS,如果单机能支持1千QPS,我们需要20台机器才能支持2万的QPS。
1 | 1. 查询有多少台机器连接到这个端口上 |