百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

合理的timeout设置,让系统的SLA大幅提升

mhr18 2024-12-07 21:54 22 浏览 0 评论

为什么会有timeout

百度了一下timeout的字面意思,就是简单的“超时”,那么timeout为什么跟我们编程息息相关,我没有找到timeout的最初的出处,但是我自己想了一下,这个应该是跟tcp/ip协议一起出现的,timeout应该是伴随着io出现的,io又分为网络io和磁盘io,当时我们不太关注磁盘io,主要关注的是网络io,所以我感觉是跟tcp/ip协议一起出现的,这个具体还要在查一下。如果网络交互没有timeout会出现一个什么情况?我不知道对端是否存活,那么有人说了我可以通过heartbeat来保持长连接,那么问题又来了,心跳间隔要设置多长?心跳间隔设置了我怎么来确定是否有心跳过来,那么就涉及到了Read心跳包,Read心跳包又回到了最初的问题,如果我们不设置timeout会有啥结果?


不设置timeout的危害

如果我们不设置timeout会有什么影响呢?

例子1:以前在做长连接push服务的时候遇到了一个问题,就是一台服务器的长连接服务的内存在承载了100w连接的时候内存使用非常高,当时是用golang语言开发的,每条连接会有两个goroutine(读和写)来维护长连接的交互,每个goroutine占用4KB(golang1.4以后已经变为2KB,轻量的goroutine+channel是golang语言适合并发开发的优势)的大小,那么我们可以估算一下不到4G的内存使用,加上其他的一些信息总共不应该超过5G,但是当时的内存使用都是10多G,一直比较纳闷,好在golang有比较好的runtime的pprof的监测,能够很容易的dump出来整个goroutine的运行情况(类似于java的jstack),当拿到这些信息的时候,通过分析看到有很多的goroutine停留在socket的read上,而且是刚刚建立连接,等到握手信息的read上边,由于golang的并发比较简单,我们对于read采用了阻塞read,看到这个异常以后就开始检查代码,发现read的时候没有设置timeout,如果没有设置read会有什么结果呢,这个等待read的goroutine就会一直在阻塞read(一直到操作系统层面的tcp超时,一般默认是两个小时),那么就造成了goroutine(java里边可能是thread)的泄露,从而造成了内存泄露,也就能理解为什么内存过高了。找到问题修改代码,只加了一行代码就解决了这个问题。

例子2:我们的线上系统,经常会遇到一个错误,就是redis获取连接超时,遇到这种问题,很多人就来找我说是不是redis挂了,我看到这个问题一般的反应:

  • 在使用redis的时候取到连接用完没有放回,这也是一种连接泄露的情况
  • 还有在并发很高,连接池的连接设置的比较小,不够用了,比如你的redis的连接设置的是10条,每个redis的请求是10ms,那么1s最多能够完成1000个请求,所以当你的qps超过1000的时候会出现什么情况?就是刚才提到的获取连接超时。
  • 还有一种情况是redis的卡顿(redis是单线程工作的,所以决定它的一些应用场景,具体可以自己网上查看相应的资料,或者有兴趣下来再单独沟通redis的问题),redis的卡顿会导致所有的请求都会耗时比较高,那么也会遇到获取连接超时的问题。 重点要说的是最后一种情况,我们假设最后一种情况我们没有设置超时时间,那么会有一个什么样的结果,所有的连接都在等待redis的响应结果,所有的业务线程都在等待redis的连接,那么请求越堆积越多,一种是造成整个系统的雪崩,一种是如果没有控制好thread的数量,thread会一直增加最后导致oom。

例子3:商户中心auth模块,出现过两次获取mysql连接超时,当时看到以后由于影响比较大,直接重启服务,然后开始追查问题,首先是检查mysql的慢日志,发现没有慢日志,然后检查mysql事务里边除了mysql的操作,还有没有其他的阻塞操作,发现很多的redis的操作,而且redis的value比较大,操作比较复杂,而且当时redis没有设置超时时间,第一反应就是redis的阻塞导致了mysql的事务的阻塞,从而导致了连接不够用。商户中心改掉了redis的处理,增加了超时时间,结果没过几天又出现了,这次出现问题以后,直接先jstack了一份信息,然后重启恢复,分析jstack的信息,发现一个奇怪的现象,很多的线程都在等着写文件的锁。分析代码,发现一个问题,就是mybatis开启了debug模式,有大量的mysql日志输出,而且是输出到了console,默认的docker容器的console就是linux操作系统的messages文件,由于写的数量巨大,导致了磁盘io的卡顿,从而导致了mysql事务的阻塞,从而获取连接失败,那么找到问题,修改就是改个配置的事情,把mybatis的debug关闭。从这个问题我们看到的是磁盘io的问题,磁盘io的问题遇到的很少不过也会遇到,这种情况我们应该如何避免呢?

  • debug日志慎用
  • 不要乱输出日志,输出有用日志
  • 学会使用异步日志(掌握的情况下可以使用,必然会出现比同步日志更恶化的情况,还可能出现丢日志)

如何更好的设置自己的timeout

如何设置好timeout,这个题目比较大,我大概结合着自己的经验提供一些参考,当时我不是说这个请求就是设置多少s,或者多少ms,这个是没有意义的,也不能拍着脑袋说。

  • 中间件+存储的timeout涉及,除了mysql其他的都还好,可以根据系统的运行情况来调整,mysql的相对比较麻烦,我们能设置的就是获取连接的超时时间,那么设置多长时间合适呢?这个一般来说都是10s,当然这个需要根据整个系统的吞吐和连接池的大小来做相应的设置。
  • 业务超时,grpc+http的,grpc一般都是内部服务的请求,那么我们也需要根据系统的吞吐和业务的情况来做相应的调整,比如现在绝大部分设置的grpc的timeout都是30s,大部分情况下是满足需求的,但是也有风险,就是刚才提到的thread泄露,导致系统的oom,所以说整个设计需要根据系统的情况来做调整
  • 请求第三方的接口的超时,我们一般请求第三方都是http的接口请求,那么http的超时设计也会涉及到第三方系统的一个性能的情况,这种一般都需要自己根据系统运行情况来做统计分析,最后得出一个比较合理的值,那么如果不设计timeout会出现什么情况?必然是thread泄露,从而导致oom或者整个系统hang住,我们老的微信餐厅,就是因为请求支付宝和微信没有设置timeout导致tomcat的线程数打满,从而导致整个系统hang住,服务不可用。

总结一下:有io的地方就必须有timeout,这个可以当成是一个编程的惯例或者一个规则。好的timeout的设计可以使系统更加的健壮,对用户更加的优雅。timeout其实也是对系统的一种熔断降级。

相关推荐

Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway

AI-generatedimageAsianFin--Dubaiisrapidlytransformingitselffromadesertoilhubintoaglob...

OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs

TMTPOST--OpenAIisescalatingthepricewarinlargelanguagemodel(LLM)whileseekingpartnershi...

黄仁勋说AI Agent才是未来!但究竟有些啥影响?

,抓住风口(iOS用户请用电脑端打开小程序)本期要点:详解2025年大热点你好,我是王煜全,这里是王煜全要闻评论。最近,有个词被各个科技大佬反复提及——AIAgent,智能体。黄仁勋在CES展的发布...

商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署

1、本文属于mini商城系列文档的第0章,由于篇幅原因,这篇文章拆成了6部分,本文属于第5部分2、mini商城项目详细文档及代码见CSDN:https://blog.csdn.net/Eclipse_...

Python+Appium环境搭建与自动化教程

以下是保姆级教程,手把手教你搭建Python+Appium环境并实现简单的APP自动化测试:一、环境搭建(Windows系统)1.安装Python访问Python官网下载最新版(建议...

零配置入门:用VSCode写Java代码的正确姿

一、环境准备:安装JDK,让电脑“听懂”Java目标:安装Java开发工具包(JDK),配置环境变量下载JDKJava程序需要JDK(JavaDevelopmentKit)才能运行和编译。以下是两...

Mycat的搭建以及配置与启动(mycat2)

1、首先开启服务器相关端口firewall-cmd--permanent--add-port=9066/tcpfirewall-cmd--permanent--add-port=80...

kubernetes 部署mysql应用(k8s mysql部署)

这边仅用于测试环境,一般生产环境mysql不建议使用容器部署。这里假设安装mysql版本为mysql8.0.33一、创建MySQL配置(ConfigMap)#mysql-config.yaml...

Spring Data Jpa 介绍和详细入门案例搭建

1.SpringDataJPA的概念在介绍SpringDataJPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射(Object-Re...

量子点格棋上线!“天衍”邀您执子入局

你是否能在策略上战胜量子智能?这不仅是一场博弈更是一次量子智力的较量——量子点格棋正式上线!试试你能否赢下这场量子智局!游戏玩法详解一笔一画间的策略博弈游戏目标:封闭格子、争夺领地点格棋的基本目标是利...

美国将与阿联酋合作建立海外最大的人工智能数据中心

当地时间5月15日,美国白宫宣布与阿联酋合作建立人工智能数据中心园区,据称这是美国以外最大的人工智能园区。阿布扎比政府支持的阿联酋公司G42及多家美国公司将在阿布扎比合作建造容量为5GW的数据中心,占...

盘后股价大涨近8%!甲骨文的业绩及指引超预期?

近期,美股的AI概念股迎来了一波上升行情,微软(MSFT.US)频创新高,英伟达(NVDA.US)、台积电(TSM.US)、博通(AVGO.US)、甲骨文(ORCL.US)等多股亦出现显著上涨。而从基...

甲骨文预计新财年云基础设施营收将涨超70%,盘后一度涨8% | 财报见闻

甲骨文(Oracle)周三盘后公布财报显示,该公司第四财季业绩超预期,虽然云基建略微逊于预期,但管理层预计2026财年云基础设施营收预计将增长超过70%,同时资本支出继上年猛增三倍后,新财年将继续增至...

Springboot数据访问(整合MongoDB)

SpringBoot整合MongoDB基本概念MongoDB与我们之前熟知的关系型数据库(MySQL、Oracle)不同,MongoDB是一个文档数据库,它具有所需的可伸缩性和灵活性,以及所需的查询和...

Linux环境下,Jmeter压力测试的搭建及报错解决方法

概述  Jmeter最早是为了测试Tomcat的前身JServ的执行效率而诞生的。到目前为止,它的最新版本是5.3,其测试能力也不再仅仅只局限于对于Web服务器的测试,而是涵盖了数据库、JM...

取消回复欢迎 发表评论: