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

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

  •  
  •   drymonfidelia · 142 天前 · 1962 次点击
    这是一个创建于 142 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    建议看日志吧。。。
    PerFectTime
        23
    PerFectTime  
       141 天前
    内存占用情况怎么样?发上来看一下。

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

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

    # ulimit -n
    65535

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