《.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. Moment.js常见用法总结

    Moment.js常见用法总结 Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率. ​ 日常开发中,通常会对时间进行下面这几个操作:比如获取时 ...

  2. B. Two Fairs 解析(思維、DFS、組合)

    Codeforce 1276 B. Two Fairs 解析(思維.DFS.組合) 今天我們來看看CF1276B 題目連結 題目 給一個連通圖,並給兩個點(\(a,b\)),求有多少點對使得:任一路徑 ...

  3. Spring入门-----------------属性注入和对象注入

    属性注入即通过setter方法注入bean的属性或依赖对象. 属性注入使用<property>元素,使用name属性指定bean的属性的名称,value属性或<value>子节 ...

  4. Boxing

    测试自动装箱和自动拆箱,意思是运行的时候编译器帮我们加了两个代码: public class AutoBoxingandUnBoxing { public static void main(Strin ...

  5. Js模块化开发的理解

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

  6. 简单Emacs配置

    (global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C-s&q ...

  7. 851. Loud and Rich —— weekly contest 87

    851. Loud and Rich 题目链接:https://leetcode.com/problems/loud-and-rich/description/ 思路:有向图DFS,记录最小的quie ...

  8. 重拾python所要知道的一些主干知识点

    前言:因为有一段时间没有用python了,最近需要用到,只能回头过去看B站视频补一补,因为语言都是相通的,而且一些细节都可以去查表解决,所以呢,我们只需要知道一些python与其他语言的不同和常见的优 ...

  9. SVG--D3--血缘关系树

    最近的工作与可视化有关,有展示血缘关系树的需求 ,类似于这样: 碰巧搜到 D3(用于可视化的js库,作者吕之华),瞬间无法自拔,它的树状图功能基于SVG.js ,暴露的可操作入口也简洁恰当,能帮助你快 ...

  10. 数据库会话数量过多,定期清理inactive会话

    1.1现象 存在一套11.2.0.4 RAC 2节点,数据库存在5000个会话数量,其中active正在执行的会话500个,其余均为非活跃会话. 大量inactive会话过多给Oracle数据库带来什 ...