V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drymonfidelia
V2EX  ›  .NET

求助(附日志)ASP.NET Core 部署在 Ubuntu 22.04 8 核 32G 阿里云下每月固定出现一次服务器失联情况,具体时间随机,失联后系统盘 IO 爆表,重启可解决,应该从哪里开始排查?完全没思路,附日志

  •  
  •   drymonfidelia · 2023-12-04 10:47:32 +08:00 · 2695 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    半年前是每月本机 Redis 连接超时( StackExchange.Redis.RedisTimeoutException: Timeout awaiting response (outbound=0KiB, inbound=0KiB, 6???ms elapsed, timeout is 5000ms),程序大量使用了 Redis 缓存数据,日志里每隔几天就会出现这个错误,因为错误会自动重试,实际并没有影响到业务,因此一直没人管,不知道和每月固定服务挂掉一次是否有关),重启后就出现登录验证码 500 错误的问题,看日志找不到 dll ,见图: 我用 python 写了一个每 5 秒请求一次验证码接口,连续 2 次 500 错误则重启服务,稳定 3 个月后故障升级为每月服务器失联,失联期间日志没记录到任何错误,但客户从阿里云小程序看系统盘 IO 爆表: SSH 也连接不上。同一套系统以前部署在 Windows Server 下非常稳定,但因为一些非技术原因现在必须部署在 Linux 下。

    26 条回复    2023-12-21 15:40:56 +08:00
    aw2350
        1
    aw2350  
       2023-12-04 10:51:19 +08:00
    .net 这玩意跨平台的稳定性还是差点,实际应用案例也不多,出了问题都找不到方案
    drymonfidelia
        2
    drymonfidelia  
    OP
       2023-12-04 10:51:34 +08:00
    图片看不清可以右键打开原图。
    drymonfidelia
        3
    drymonfidelia  
    OP
       2023-12-04 10:57:37 +08:00
    眼花放错日志了,日志里不是验证码接口,是微信公众号推送消息的接口,但错误原因是一样的,大量 System 开头的 dll 无法加载
    drymonfidelia
        4
    drymonfidelia  
    OP
       2023-12-04 10:58:49 +08:00
    @drymonfidelia #3 systemd 自动重启后才会出现这个问题,手动重启可恢复正常
    drymonfidelia
        5
    drymonfidelia  
    OP
       2023-12-04 11:05:25 +08:00
    @drymonfidelia #3 又说错了,日志里是微信公众号内网页登录的接口,排查了一整晚没研究出来不太清醒先去睡一会儿
    drymonfidelia
        6
    drymonfidelia  
    OP
       2023-12-04 11:07:04 +08:00
    数据库用的是云 MySQL 数据库,不在服务器上。
    thtznet
        7
    thtznet  
       2023-12-04 11:08:55 +08:00
    优先考虑文件有没有可能被杀掉,国内的 VPS 有时会做一些多余的事情,虽然名义上为了安全。
    Shuu
        8
    Shuu  
       2023-12-04 11:11:52 +08:00 via Android
    上面的不太懂,监控上磁盘 IO 持续爆表的情况遇到过,都是因为内存被占满了,可以看看是不是有什么进程在不断吃内存
    jgh004
        9
    jgh004  
       2023-12-04 11:15:25 +08:00
    可能跟系统有关系,我用腾讯云 centos 系统,装的梯子,以前也经常三天两头 io 爆表,发工单人家也查不到问题。后来换了 ubuntu ,没事了。
    thinkershare
        10
    thinkershare  
       2023-12-04 11:16:26 +08:00
    @drymonfidelia 服务程序没有日志,OS 也没用系统日志吗? 你的 Redis 是否有高频写入操作? 你给出来的信息实在太少了。我们部署在 Ubuntu 20.04 上的系统 4 年了,没出过什么问题。
    thinkershare
        11
    thinkershare  
       2023-12-04 11:20:19 +08:00
    先试着将 runtime 和程序服务捆绑到一起发布,然后看看这个 dll 丢失是否还会存在。另外 StackExchange.Redis 高频写入会有问题,换库才能解决。
    leaflxh
        12
    leaflxh  
       2023-12-04 11:22:57 +08:00
    服务器上有开 swap 吗

    看到你用 redis 存大量数据,或许是内存爆了,然后向 swap 写数据,然后阿里云的普通硬盘的性能不足以支撑大量的随机读写
    a33291
        13
    a33291  
       2023-12-04 11:25:58 +08:00
    在 centos7/8 rocky8/9 ubuntu18/20/22 kylin10 上都长期运行.net3.1/6,没遇到过这种问题

    至少要知道是什么进程吃 io 吧,.net 这个报错看不出和磁盘之间有关
    应该有监控系统能定时监测 io,先找谁吃掉 io 的在说,讲证据而不是猜测打胡乱说
    blackeeper
        14
    blackeeper  
       2023-12-04 11:26:54 +08:00
    系统没有 swap 分区的可以考虑手动加一个。
    skwyl
        15
    skwyl  
       2023-12-04 11:27:23 +08:00
    可以看看 12 楼得方案,swap 还真有可能出问题,阿里云得磁盘高频写入独取数据磁盘占用会高
    hez2010
        16
    hez2010  
       2023-12-04 13:23:00 +08:00
    你可以挂一个 dotnet-trace 在后台跑着,等出问题了用 PerfView 看 trace 文件,说不定能抓到一些线索。
    hez2010
        17
    hez2010  
       2023-12-04 13:24:14 +08:00
    顺带一提,阿里云的服务器里内置的安全软件(无论 Linux 还是 Windows Server )有时候也是出现莫名其妙问题的原因之一
    StoneHuLu
        18
    StoneHuLu  
       2023-12-04 13:44:59 +08:00
    先丢 docker 里跑一阵子看看 docker 挂不挂
    drymonfidelia
        19
    drymonfidelia  
    OP
       2023-12-04 13:53:07 +08:00
    @thtznet 没有被杀掉,手动重启就能正常运行
    @Shuu 内存占用率一直很低
    @thinkershare 没有高频写入,只有高频读取,读取量远大于写入
    @leaflxh 确实是没有 swap ,但是 avail Mem 一直在 10GB 以上
    thinkershare
        20
    thinkershare  
       2023-12-04 14:33:49 +08:00
    @drymonfidelia 实在不行,采用 @StoneHuLu 说的,跑在容器里面看看,限制下资源使用率。或者使用 @hez2010 说的,上追踪看看,服务器性能没问题,应该影响也不大。
    ragnaroks
        21
    ragnaroks  
       2023-12-04 15:39:31 +08:00
    磁盘先处于不可用状态,然后 kestrel 在某次创建 ssl connection 的过程中尝试加载 system.collections.nogeneric ,加载失败后抛出未处理异常。

    你再开一个机器,前面做负载均衡,理论上当这台机器爆炸的时候另一台应该正常;也就是说,我认为问题出在极其常见的阿里云超售失控。
    encro
        22
    encro  
       2023-12-04 17:36:33 +08:00
    也许是:

    redis 占用内存过大(没有释放),被阿里云盾给 kill 了。。。。
    我遇到过这种情况。

    如果不是本机 redis ,可能还受到带宽限制。。。

    建议看日志吧。。。
    PerFectTime
        23
    PerFectTime  
       2023-12-04 19:54:54 +08:00
    内存占用情况怎么样?发上来看一下。

    之前我们也有遇到过这样的问题,原因是手动实现了一个队列断线重连的逻辑,然后一直递归执行导致应用程序占用超大内存,以致 redis/mq 没有足够的内存,然后应用连接不上反复重连,导致服务器卡死,故障现象为:IO 占用超高,ssh 无法连接,无法对外访问,软重启无效。

    之前排查问题的时候也有考虑过用 dotnet-trace 或者 dump 之类的东西去查,但是根本支撑不到能 dump 到数据的时候。
    建议还是找一下重连、或者 redis 内存占用的问题
    azraelrabbit
        24
    azraelrabbit  
       364 天前   ❤️ 1
    看你的异常信息,里是从 swagger 里调用了 weixinlogin 。。。 盲猜是 weixinlogin 调用出了问题, 可能是 http 请求过多没有释放。 你可以尝试 ulimit -n 看一下系统当前的最大文件描述符数是多少,然后排查以下 从 swagger 到 weixinlogin 这块逻辑有没有 http 连接 未释放或其他异常, 盲猜是这块逻辑有 bug ,导致大量 http 连接无法释放,导致文件描述符被大量占用或耗尽,才造成的 io 爆满,以及其他异常
    drymonfidelia
        25
    drymonfidelia  
    OP
       364 天前
    @azraelrabbit

    # ulimit -n
    65535

    阿里云模板默认好像就是 65535 吧,应该没问题
    swagger 到 weixinlogin 这块逻辑有没有 http 连接 未释放 释放 http 连接应该是 ASP.NET Core 框架管理的吧?
    blankqwq
        26
    blankqwq  
       348 天前
    会不会是中了 rdb 攻击
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 17:48 · PVG 01:48 · LAX 09:48 · JFK 12:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.