Chaney不会代码 📅 发布时间:2026/7/13 13:03:39 👁️ 浏览次数: 乩关酒罩最近买了台mac mini用来写博客但迟迟没有动笔。虽然积累了非常多的素材但写一篇《解Bug之路》系列的博客实在是太累人了。同时也很久没有那种让我感到兴奋的问题了。但总归不能让这台新买的mac mini成为摆设于是就写一些平时遇到的小问题吧。问题现场问题是喜闻乐见的调用超时。这个问题的显著特征是:1.流量小的时候容易出现偶发性访问超时一般是空闲很长时间后的第一笔请求超时。2.调大超时时间没有任何效果平常请求在1s内就能返回。但出现这类超时的时候就算调整到1min超时时间依旧会超时。3.超时后的重试调用一般都会成功。4.同一时间其它相同调用不会出现问题。5.在内网调用不会出现这个问题在非内网调用不管是专线还是互联网都容易出现这个问题。6.服务端无法搜索到任何日志仿佛这个超时请求没有出现过。猜想1:服务端关闭了连接一个非常直观的猜想就是服务端关闭了这个链接请求直接被拒绝了。但熟悉tcp协议的笔者很快否定了这个猜想如果连接被关闭了会有下面图中所示的两种情况:serverclientserverclientalt[client未收到FIN包][client收到FIN包]请求正常返回close连接tcp packettcp resetsocket has already closed第一种情况client端没有收到服务端返回的FIN包那么在请求发送后应该是直接被对端Reset立刻感知到报错。第二种情况client端收到了服务端返回的FIN包那么在请求发送前会直接报socket has already closed立刻感知到报错。根据上面的判断无论什么情况都是立刻返回而不是等待很长时间之后超时和特征2不符于是可以否定由于服务端关闭连接导致。猜想2:偶发性路由翻动因为过了非常长的时间才超时这时候我们的就可以考虑是在网络层丢包了。那么到底为什么丢包呢难道是偶发性的路由翻动这个想法立马被笔者否决了。因为如果是路由翻动一般会在分钟级别的收敛而我们观察到在5s超时后的重试都是成功的。而且一旦路由翻动这段时间内所有的请求都应该收到影响而问题现场其它请求确实正常的。这就和特征3/特征4不符合。猜想3(真正的原因)其实这个问题笔者一直遇到而且解决方案也一直有但从没有真正的仔细思考过。但最近读《tcpip路由技术》卷二突然灵光一闪将书中的一些阐述和这个问题莫名的关联想通了其中的关窍。人们由于IPv4地址即将耗尽而不得不开发出NAT技术而NAT毕竟只是个补丁其无法完整的融合进TCP导致出现种种因为这个补丁而出现的问题。我们通过NAT设备中的转发表项维护内网的ip:port和外网的ip:port之间的映射入下图所示:很明显的由于client和server的数量是非常多的(因为多个服务可能公用一个公网IP)所以转发表是一个非常宝贵的资源一旦转发表满了就无法创建新的连接路径了。所以一些长期没有流量需要有一个定时的清理机制腾出转发表以供新的连接创建。如下图所示在tcp连接estalbish状态后一定时间内没有任何流量NAT会直接清空这个转发表项而client和server端无法感知到这一点于是client端只好在多次NAT重传后超时。这个和Bug现场的各种特征完全一致。当然无论是NAT-1和NAT-2都有可能清理转发表只要有一个过期那么这个连接就会出现超时。使用LVS做NAT的默认超时时间那么我们看一下我们最常用的使用LVS做NAT的默认超时时间是多少让我们来番一下LVS源代码:static const int tcp_timeouts[IP_VS_TCP_S_LAST1] {[IP_VS_TCP_S_NONE] 2*HZ,[IP_VS_TCP_S_ESTABLISHED] 15*60*HZ, // 这边设定了ESTABLISHED状态的超时时间为15min[IP_VS_TCP_S_SYN_SENT] 2*60*HZ,[IP_VS_TCP_S_SYN_RECV] 1*60*HZ,[IP_VS_TCP_S_FIN_WAIT] 2*60*HZ,[IP_VS_TCP_S_TIME_WAIT] 2*60*HZ,[IP_VS_TCP_S_CLOSE] 10*HZ,[IP_VS_TCP_S_CLOSE_WAIT] 60*HZ,[IP_VS_TCP_S_LAST_ACK] 30*HZ,[IP_VS_TCP_S_LISTEN] 2*60*HZ,[IP_VS_TCP_S_SYNACK] 120*HZ,[IP_VS_TCP_S_LAST] 2*HZ,};struct ip_vs_conn *ip_vs_conn_new(......){......timer_setup(cp-timer, ip_vs_conn_expire, 0); // 在初始化连接的时候设置超时函数ip_vs_conn_expire......}static void ip_vs_conn_expire(struct timer_list *t){......if (likely(ip_vs_conn_unlink(cp))) { // 在这里清理转发表......}......}static inline void set_tcp_state(......){......// 通过状态在tcp_timeout表中找到相应的超时时间并设置进timeoutcp-timeout pd-timeout_table[cp-state new_state];......}从上面代码中我们可以看到LVS通过设置的timeout_table来设置转发表项超时时间而不同的tcp状态会有不同的超时时间而默认的established的超时时间是15 * 60 * HZ也就是15min。也就是说在默认不设置的情况下15min中之后这个连接就会GG。解决方案好了了解完原理之后我们就可以有解决方案了。第一种方案就是使用短连接。也就是每次请求的时候新建一个连接NAT本身对tcp的FIN包做了处理一旦发生四次挥手会自动清理表项。用完即回收即减少了NAT设备转发表的压力也不会产生过一段时间超时的问题。但这个方案有个缺陷也是短连接的固有缺陷。由于复用不了连接短时候有海量的请求过来产生大量的短连接由于TCP 2MSL机制的存在client即有可能出现端口耗尽。而端口耗尽后会导致Kernel在搜索可用端口号的时候性能急剧劣化(每次搜索端口从数次循环急剧劣化到每次搜多端口都要数万次循环)这会导致client端的机器CPU利用率急剧上升一直陷在搜索端口号的循环里面导致整体不可用 如下图所示:具体分析可以见笔者的另一篇博客: https://my.oschina.net/alchemystar/blog/4436558为了解决第一种的方案的问题我们可以依旧复用连接只不过这个复用时间特别短例如6s之内复用超过6s的连接就直接丢弃。这样既能在大量请求涌过来的时候扛住又能解决长时间不用的超时问题。HttpClient其实提供这个机制如下所示:HttpClients.custom().evictIdleConnections(6, TimeUnit.SECONDS)第三种方案我们可以轮询每一个connection发送心跳包但这个实现起来比较麻烦远没有上面的HttpClient内置方案省心。还有一个需要提到的是Http的Keep-alive连接的保持时间是在Server端设置的。而这个Keep-alive timeout可能 NAT的清理时间。对于Client端来说很难约束Server端的配置。所以笔者还是建议采用第二种方案。总结NAT虽然大幅度延长了IPV4地址耗尽的时间但由于只是打了补丁它的固有缺陷会导致很多问题。不过我们会根据遇到问题的原因给出各种解决的方案从而让系统稳定的运行。如果具备相应的基础知识这个问题非常容易解决。但如果没有对整个通信过程有一个大致的理解会无从着手所以系统化的学习非常重要。
【开题答辩全过程】以 淮胜景区信息管理系统为例,包含答辩的问题和答案 个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的… 2026/7/12 17:36:26
如果事先没有定义静态关系,在实际代码中,我们就需要提供一种使用动态关系的机制,让我们的查询、类型推断、DTO推断等能力得以正常使用。 ... 酶罢派缸1 基础使用com.github.houbbsensitive-word0.29.2SensitiveWordHelper 作为敏感词的工具类,核心方法如下: 示例代码: import com.github.houbb.sensitive.word.core.SensitiveWordHelper; public class BasicExample {public static … 2026/7/6 14:30:15
GitHub开源项目:IT-Tools源码构建部署及其部署排错 坡凑是喊虽然说是手算,但是我还是会写一点 C# 代码,避免敲坏了计算器。我和大家保证,整个手算过程中,最终的计算结果只需要用到初高中知识。推导过程会用到部分高数的知识。我尽量将用到的知识点全列举出来,本文对学渣… 2026/7/10 5:05:59
小红书文案正在消失?不,是人工写作已失效!ChatGPT+人工校准双引擎工作流(附内部审核checklist) 更多请点击: https://kaifayun.com 第一章:小红书文案正在消失?不,是人工写作已失效! 当一条爆款笔记的平均创作耗时从47分钟飙升至3小时,当92%的运营团队开始复用同一套“万能模板”,当用户对… 2026/7/13 13:02:01
ChatGPT视频理解功能正式开放内测(仅限前500家企业|含Token配额与延迟SLA白皮书) 更多请点击: https://kaifayun.com 第一章:ChatGPT视频理解功能正式开放内测公告解析 OpenAI于2024年7月正式宣布ChatGPT视频理解(Video Understanding)能力进入受限内测阶段,标志着多模态交互从静态图像迈向动态时序… 2026/7/13 13:02:01
分段→锚定→归因→压缩→校验,Claude长文档五步精炼法,手把手带练企业级合同/研报/法律文书 更多请点击: https://kaifayun.com 第一章:分段→锚定→归因→压缩→校验,Claude长文档五步精炼法总览 面对动辄数万字的技术文档、会议纪要或产品需求说明书,Claude虽具备强大上下文理解能力,但直接输入全文常导致关… 2026/7/13 13:02:01
鸣潮工具箱WaveTools:解决游戏性能痛点的终极解决方案 鸣潮工具箱WaveTools:解决游戏性能痛点的终极解决方案 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》游戏卡顿、画质不佳而烦恼吗?你是否经常因为多个账号切换繁琐、… 2026/7/13 13:00:01
Revit模型无损导出GLTF/GLB:保留材质与UV的轻量级工作流 1. Revit模型导出GLTF/GLB的常见问题如果你经常需要将Revit模型导出为GLTF或GLB格式,相信你一定遇到过材质丢失和UV贴图错位的问题。这主要是因为Revit原生导出功能对这两种格式的支持有限,导致在转换过程中无法完整保留模型的视觉信息。Revit自带的FBX导… 2026/7/13 12:58:00
Gitee 镜像同步 GitHub 仓库:3步解决国内网络下载缓慢问题 Gitee 镜像同步 GitHub 仓库:国内开发者的高效协作方案 对于国内开发者而言,访问 GitHub 上的深度学习项目常常面临网络延迟和下载速度慢的问题。本文将介绍如何利用 Gitee 的镜像功能,实现 GitHub 仓库的快速同步和高效访问。 1. 为什么需… 2026/7/13 12:58:00
HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70+个痛点 HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70个痛点 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经在Honey Select 2中遇到过… 2026/7/13 0:01:19
语音转文字工具AsrTools:让音频整理变得简单高效 语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text … 2026/7/13 0:03:19
基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_ 基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 独家界面!不会重复,此项目属于本人原创,若有雷同,均是盗卖,各位买… 2026/7/13 0:05:20
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/13 9:31:08
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/13 2:34:55