起因:

购买了阿里云的redis节点,但是默认阿里云不提供公网IP,所以我在一台阿里云的机器启动了rinetd,做端口的转发服务,开始一切正常,一段时间以后,随着并发力度加大。我们发现redis连不上了,提示Connection reset by peer

排查

1. 排查Redis

为什么会这样,首先我怀疑,是否redis有问题
首先我查看了redis的负载情况,使用INFO 命令

# Clients
connected_clients:192
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:16# Stats
total_connections_received:1131
total_commands_processed:7225865
instantaneous_ops_per_sec:30
total_net_input_bytes:216949807
total_net_output_bytes:87315792

显然redis的负载并不高
instantaneous_ops_per_sec 要超过2w, 负载才算高
connected_clients还不到200, 默认的设置允许最大连接数是1w

2. 排查阿里云主机

首先这台的机器的连接数并不高

[root@xxx-xx-77 ~]# ss -s
Total: 733 (kernel 751)
TCP:   644 (estab 598, closed 1, orphaned 0, synrecv 0, timewait 1/0), ports 234Transport Total     IP        IPv6
*     751       -         -
RAW   0         0         0
UDP   1         1         0
TCP   643       636       7
INET      644       637       7
FRAG      0         0         0

但是观察机器的CPU使用率

top - 13:34:57 up 72 days, 21:21,  2 users,  load average: 1.03, 1.32, 1.08
Tasks: 264 total,   2 running, 262 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.6%us,  9.9%sy,  0.0%ni, 85.8%id,  0.0%wa,  0.0%hi,  0.8%si,  0.0%st
Mem:  15641200k total, 15093856k used,   547344k free,   246612k buffers
Swap:  4194300k total,        0k used,  4194300k free,  3384744k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19532 root      20   0  9284 1828  612 R 100.0  0.0  16:18.16 rinetd6456 root      20   0 96076  10m 1292 S 11.6  0.1  35:13.00 redis-server
13636 rabbitmq  20   0 6029m 255m 3940 S  0.7  1.7   1912:26 beam.smp
16505 root      20   0  935m  79m 9.9m S  0.3  0.5 184:33.40 docker
20069 root      20   0 17208 1380  952 S  0.3  0.0   0:15.24 top
20312 root      20   0 17208 1384  952 R  0.3  0.0   0:00.01 top1 root      20   0 21408 1636 1312 S  0.0  0.0   0:54.05 init

很明显是rinetd 所占CPU过高,这是一个异常点

[root@bbd-iner-2-77 ~]# ps -mp 19532 -o THREAD,tid
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID
root     36.6   -    - -         -      -     -
root     36.6  19    - -         -      - 19532

使用strace 追一下系统调用

strace -p 19532
sendto(1024, "*3\r\n$3\r\nSET\r\n$5\r\n11111\r\n$2\r\n15\r\n", 32, 0, NULL, 0) = 32
select(1025, [4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
... ...
993 997 999 1003 1007 1009 1013 1017])
recvfrom(408, "+OK\r\n", 1024, 0, NULL, NULL) = 5
recvfrom(409, "*3\r\n$3\r\nSET\r\n$5\r\n11111\r\n$2\r\n15\r\n", 1024, 0, NULL, NULL) = 32
recvfrom(411, "*3\r\n$3\r\nSET\r\n$5\r\n11111\r\n$2\r\n15\r\n", 1024, 0, NULL, NULL) = 32
sendto(413, "$2\r\n15\r\n", 8, 0, NULL, 0) = 8
recvfrom(415, "*2\r\n$3\r\nGET\r\n$5\r\n11111\r\n", 1024, 0, NULL, NULL) = 24
recvfrom(423, "*2\r\n$3\r\nGET\r\n$5\r\n11111\r\n", 1024, 0, NULL, NULL) = 24
recvfrom(425, "*2\r\n$3\r\nGET\r\n$5\r\n11111\r\n", 1024, 0, NULL, NULL) = 24
recvfrom(440, "+OK\r\n", 1024, 0, NULL, NULL) = 5

rinetd 没有使用epoll,而是用了select
众所周知, select是基于类似的轮训的机制,反复去查询fd的情况,并且会在内核空间和用户空间拷贝fd集合
在IO比较高的情况下,select相比epoll有更高的CPU消耗,并且select默认最大支持1024个fd
所以rinetd才把CPU打的比较高,导致转发服务异常

解决

直接使用nginx的tcp proxy模块,问题解决,并且CPU使用率也不高

参考资料:
1. select、poll、epoll之间的区别总结[整理]
2. NGINX Load Balancing – TCP and UDP Load Balancer

rinetd 在生产环境要谨慎使用相关推荐

  1. 生产环境使用ioprofile一定要谨慎

    从高性能mysql的博客上看到aspersa工具,试用了一下,感觉非常不错,但是在生产环境使用的时候一定要谨慎,今天我在本地测试环境使用ioprofile,导致mysql挂起,具体使用手册请参考: 官 ...

  2. linux生产环境下安装anaconda总结

    前言: 工作中,常常要在新的linux生产服务器中安装自己的集成python环境,这种情况下有一点需要注意:不能覆盖生产服务器中的python环境(也就是自己的python环境要和系统的python环 ...

  3. 一文教你如何在生产环境中在Kubernetes上部署Jaeger

    作者 |  Dotan Horovit 翻译 | 火火酱~ 责编 | 晋兆雨 出品 | CSDN云计算 日志.指标和跟踪是"可观察性"领域的三大支柱.最近几个月,随着OpenTel ...

  4. Mysql+Heartbeat+Drbd生产环境高可用部署若干问题解惑

    Mysql+Heartbeat+Drbd生产环境高可用部署若干问题解惑: ############################################################ # ...

  5. hbase 命令_HBase原理与实践 | 生产环境上线前真的优化过吗?

    笔者今天给大家讲一下 HBase 生产环境中的实践,包括资源隔离.参数配置.性能优化等方面,部分内容参考<HBase原理与实践>(非常建议大家好好读一读,一定会大有收获),以及笔者的实战经 ...

  6. 生产环境中,RabbitMQ 持续积压消息不进行ack ,发生什么了?

    问题:生产环境 rabbitmq 部分客户端 channel 持续积压消息不进行ack. 0. 服务配置 rabbitmq 集群(普通集群模式) 消费者 三台 消费线程各消费者 10 消费者配置 使用 ...

  7. 从零搭建基于 Java 的服务器生产环境

    之前的文章介绍了我最近开发的一款工具软件 移动工具箱,然而安装包放在华为应用市场上面,如果不安装华为应用市场就无法下载软件,无奈,只能自己从零搭建一个服务器来进行应用的宣传和下载.搭建一个服务器是很简 ...

  8. 达梦数据库生产环境的单机部署

    首先进行部署前的检查 1 检查Oracle数据库的最大连接数: select value from v$parameter where name ='processes';-----2000 字符集: ...

  9. 生产环境mysql安装规划及调优实践--mysql8.0.29为例

    以前运维人员部署在生产环境的mysql又被扫描出安全漏洞,需要进行修补.这种事情本来应该是很简单的事儿,但如今执着于软件领域技术的人是越来越少,竟然没有人愿意去做去学,都想等着别人去处理,最终还是得老 ...

最新文章

  1. 邮箱自动转发攻击邮件服务器
  2. Spark源码阅读04-Spark运行架构之Standalone运行模式
  3. windows下安装ubuntu 12.04---利用ubuntu的iso包中的wubi.exe工具安装
  4. Python 多进程异常处理的方法,你会吗
  5. MTK 修改后置Camera方向/镜像 Patch
  6. 线程的三种创建方式以及代码实现
  7. redis创建像mysql表结构_Redis数据结构列表实现
  8. perror()与strerror()的应用及区别 man手册查询
  9. 关于python列表去重复后按照元列表序列输出
  10. jQuery-对标签元素 文本操作-属性操作-文档的操作
  11. BAPI:KBPP_EXTERN_UPDATE_CO, TCODE:CJ30/CJ40 第一部分
  12. java知识总结-19
  13. 计算机操作系统的分类
  14. 修改tomcat服务器图标,如何修改tomcat项目的图标(两种)
  15. java hsqldb_Java HsqlDB的初步使用和技巧总结
  16. matlab截掉空间曲面一部分,用Matlab作空间曲面的切平面及法线图像.ppt
  17. 幼儿园计算机网络教室工作计划,2017年幼儿园教学工作计划范文
  18. VR终极入门指南:设备,内容,手机...都在这里了|深扒
  19. 最流行的前端框架vue基础
  20. jsp实验中:tag文件报java.util.ArrayList cannot be cast to java.lang.String

热门文章

  1. TP6 控制器不存在:app\index\controller\Index
  2. ettercap+urlsnarf+driftnet+wireshark监听妹子上网
  3. OpenGL学习记录
  4. 2021年安全员-A证(山东省-2021版)最新解析及安全员-A证(山东省-2021版)模拟试题
  5. Mac中的番茄钟Just Focus——保持专注就对了
  6. MyBaitsPlus快速入门
  7. C语言编写规范之注释
  8. 用户登录验证最多3次java_实现用户注册、登录、幸运抽奖功能,验证次数最多3次...
  9. python基础编程练习_python基础练习之几个简单的游戏
  10. 怎么获取红米Note 4X的Root权限