《.NET 5.0 背锅案》第7集-大结局之后,园子和 .NET 继续过上了幸福生活。。。剧情很美好,现实很残酷。。。现实是旧案刚结,新案立至,而且新案与旧案有关联,被迫继续拍剧,并对该剧重新进行命名,剧名叫《高并发下的.NET》,第1季的剧情是《.NET 5.0 背锅案》,第2季的剧情是《memcached连接暴增案》。

就在我们发布修复 StackExchange.Redis.Extensions 并发问题的更新后的第2天就出现了 memcached tcp 连接暴增的情况(通常连接数在3k以下,暴增时竟然超过15k),而这周一至周四每天都会出现。

下图是其中1台 memcached 服务器(一共有3台)的 tcp 连接数监控图(来自阿里云云监控)

阿里云云监控的报警邮件:

华东1(杭州) 云服务器ECS实例:memcached1,云服务器实例ID=i-bp1f2iqt161cleifjsfl,状态=ESTABLISHED,instanceName=memcached1 ,Host.tcpconnection于18:41发生告警,平均值为15265.55Count,持续时间0分钟。

而昨天下午(11月26日)16:17 的访问高峰出现了一个相反情况,memcached 服务器 tcp 连接数突然暴跌

接着,16:45:07.025 开始出现 EnyimMemcachedCore 重置 socket 连接超时的错误日志

Enyim.Caching.MemcachedClient

2020-11-26 16:45:07.025 [Error] Timeout to reset an acquired socket.

16:45:07.774 开始出现 EnyimMemcachedCore 重置 socket 连接失败的错误日志

Enyim.Caching.Configuration.MemcachedClientConfiguration

2020-11-26 16:45:07.774 [Error] Failed to reset an acquired socket.

16:45:56.582 开始出现 SqlClient 连接数据库超时的错误日志,遇到这个错误的请求会出现500错误

Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

---> System.ComponentModel.Win32Exception (258): Unknown error 258

16:45:56.658 开始出现 StackExchange.Redis 的超时错误

StackExchange.Redis.RedisTimeoutException: Timeout awaiting response (outbound=0KiB, inbound=0KiB, 1444ms elapsed, timeout is 1000ms), command=MGET, next: GET blog_v2_BlogPosts-389476, inst: 0, qu: 0, qs: 3, aw: False, rs: ReadAsync, ws: Idle, in: 14559, in-pipe: 0, out-pipe: 0, serverEndpoint: redis-blog:6379, mc: 1/1/0, mgr: 8 of 10 available, clientName: blog-web-5cf67c9795-6wmvz, IOCP: (Busy=0,Free=1000,Min=20,Max=1000), WORKER: (Busy=50,Free=32717,Min=50,Max=32767), v: 2.1.58.34321 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)

at StackExchange.Redis.Extensions.Core.Implementations.RedisDatabase.GetAllAsyncT

16:45:57.305 开始出现 pod 重启的日志,说明开始有 pod 因为健康检查失败而被强制重启

2020-11-26 16:45:57.305 [Error] Request Execution Time: 7740 ms

ThreadPool.ThreadCount: 50, Pending work item count: 216, Completed work item count: 226710523

pod 启动后接入负载时由于并发请求大,EnyimMemcachedCore 出现下面的错误日志

[Error] Pool is full, timeouting. 10.0.78.156:11211

随后出现更多 SqlClient 连接数据库超时的错误日志。

Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding

16:52:00.028 EnyimMemcachedCore 开始出现告警日志

[Warning] Socket bound to "10.0.78.156:11211" has 44 unread data! This is probably a bug in the code. InstanceID was a247c5cd-575f-4f04-8573-fb03f199cb9c.

16:55 开始,从日志记录可以看出更多 pod 在重启

16:56:00.032 开始出现连接数据库服务器失败的错误

An error occurred using the connection to database '"xxx"' on server '"yyyy.sqlserver.rds.aliyuncs.com,3433"'.

Microsoft.EntityFrameworkCore.Database.Connection

日志中继续出现大量连接数据库服务器失败或者超时的错误

17:03 开始,从日志看系统恢复了正常。

目前我们还没有找到问题的线索,正在进一步排查。

最后,附上阿里云RDS的数据库连接监控图

《高并发下的.NET》第2季 - 《memcached连接暴增案》第1集:问题表现的更多相关文章

  1. 《高并发下的.NET》第2季 - 故障公告:高并发下全线崩溃

    大家好,非常抱歉,在昨天下午(12月3日)的访问高峰,园子迎来更高的并发,在这样的高并发下,突发的数据库连接故障造成博客站点全线崩溃,由此给您带来很大的麻烦,请您谅解. 最近,我们一边在忙于AWS合作 ...

  2. php结合redis实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...

  3. 高并发下MySQL出现checking permissions

    在某些数据访问层框架中,会使用show full tables from test like 'demo',来检查数据库的状态.当数据库中表的数量较少时,并没有出现严重的问题.但是当数据库中的表数量多 ...

  4. EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题

    下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道在买家下单购买商品的时候,是需要扣减库存的,当然有2种扣减库存的方式, 一种是 ...

  5. (高级篇)php结合redis实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...

  6. php结合redis实现高并发下的抢购、秒杀功能 (转载)

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...

  7. php 高并发下 秒杀处理思路

    1.用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的后台进程以及延迟问题,不予考虑. 2.数据库乐观锁,大致的意思是先查询库存,然后立马将库存+1,然后订 ...

  8. PHP开发中多种方案实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...

  9. Random在高并发下的缺陷以及JUC对其的优化

    Random可以说是每个开发都知道,而且都用的很6的类,如果你说,你没有用过Random,也不知道Random是什么鬼,那么你也不会来到这个技术类型的社区,也看不到我的博客了.但并不是每个人都知道Ra ...

随机推荐

  1. Redis学习笔记(七)——数据结构之有序集合(sorted set)

    一.介绍 Redis有序集合和集合一样都是string类型元素的机会,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.Redis正是通过分数来为集合中的成员进行从小到放大的排 ...

  2. 自己动手实现一个简单的 IOC容器

    控制反转,即Inversion of Control(IoC),是面向对象中的一种设计原则,可以用有效降低架构代码的耦合度,从对象调用者角度又叫做依赖注入,即Dependency Injection( ...

  3. NB-IoT的同步信号解析

    NB-IoT的小区搜索和LTE的小区搜索是类似的,每个UE都是通过对同步信号的检测,来实现与小区时间和频率上的同步,以此来获取小区的ID.NB-IoT的同步信号包括NPSS和NSSS. NPSS用于完 ...

  4. Redis常用命令(3)——Hash

    HDEL 格式:HDEL key field [field ...] 作用:删除哈希表中的一个或多个域. 返回值:删除的域的个数. HEXISTS 格式:HEXISTS key field 作用:判断 ...

  5. 常用数据结构-namedtuple(命名元祖)

    namedtuple从根本上来说是一个带有数据名称的元祖.它包含元祖的所有特性,但也有一些元祖没有的额外特性.使用namedtuple可以很容易创建轻量级对象类型. namedtuple将是你的代码更 ...

  6. [论文解读] 阿里DIEN整体代码结构

    [论文解读] 阿里DIEN整体代码结构 目录 [论文解读] 阿里DIEN整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x04 模型基类 4.1 基本逻辑 ...

  7. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

  8. [Luogu P4173]残缺的字符串 ( 数论 FFT)

    题面 传送门:洛咕 Solution 这题我写得脑壳疼,我好菜啊 好吧,我们来说正题. 这题.....emmmmmmm 显然KMP类的字符串神仙算法在这里没法用了. 那咋搞啊(或者说这题和数学有半毛钱 ...

  9. XJOI NOI训练2 传送

    NTT循环卷积 30分: 可以发现这是一个很明显的分层$DP$,设$dp[i][j]$表示当前走了j步走到i号节点的方案数.如果当前走的步数对节点有限制就直接将这个点的$DP$值赋成$0$ #incl ...

  10. Matlab批量绘制图像并保存

    author:ZKe ------------------------------- 以下是一个txt文件,每行11个字段,第一个字段是日期,后面10个是用户id和对应今天发表微博数,所有字段用制表符 ...