关于在1/8c1g小鸡上2api容易卡死的解决办法

事情起因是,在甲骨文大善人那里领了两台amd小鸡没处用,我就拿来做codex2api了

配置
  • Shape: VM.Standard.E2.1.Micro
  • CPU: 1/8 OCPU
  • 内存:1G
  • 免费磁盘:10VPUs/GB,我分配了50GB,IOPS=3000,吞吐为24MB/s

自此开始了我的噩梦,经常出现cpu明明是空载但系统反应极慢,后续用sar和pidstat查到是io风暴的问题

命令及输出
$ sar -u 1
23:42:23        CPU     %user     %nice   %system   %iowait    %steal     %idle
23:42:24        all      0.50      0.00      3.48     94.53      1.49      0.00
23:42:25        all      1.01      0.00      5.53     92.96      0.50      0.00
23:42:26        all      1.01      0.00      3.54     95.45      0.00      0.00
23:42:27        all      0.51      0.00      5.05     90.40      4.04      0.00
$ sudo pidstat -d 1
23:42:22      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
23:42:23        0      1212   1904.00      0.00      0.00       0  containerd
23:42:23        0      1281  19304.00      0.00      0.00       0  dockerd
23:42:23        0    656668   5388.00      0.00      0.00       0  caddy
23:42:23     1000    687151  22600.00      0.00      0.00       0  sub2api
23:42:23     1000    746727  16228.00      0.00      0.00       0  docker
23:42:23     1000    746753   2040.00      0.00      0.00       0  bash
23:42:23     1000    746754    292.00      0.00      0.00       0  docker
23:42:23     1000    746762   4292.00      0.00      0.00       0  docker-buildx
23:42:23     1000    746763   3368.00      0.00      0.00       0  docker-model
23:42:23     1000    746764   4112.00      0.00      0.00       0  docker-compose

23:42:23      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
23:42:24        0      1212   5780.00      0.00      0.00       0  containerd
23:42:24        0      1281  10852.00      0.00      0.00       0  dockerd
23:42:24        0    656668   3316.00      0.00      0.00       0  caddy
23:42:24     1000    746762  12616.00      0.00      0.00       0  docker-buildx
23:42:24     1000    746763  12124.00      0.00      0.00       0  docker-model
23:42:24     1000    746764  13044.00      0.00      0.00       0  docker-compose
23:42:24        0    746768   3080.00      0.00      0.00       0  runc
23:42:24        0    746769      8.00      0.00      0.00       0  runc

23:42:24      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
23:42:25        0      1212   1972.00      0.00      0.00       0  containerd
23:42:25        0      1281  10048.00      0.00      0.00       0  dockerd
23:42:25     1000    687151  12412.00      0.00      0.00       0  sub2api
23:42:25     1000    746762  19260.00      0.00      0.00       0  docker-buildx
23:42:25     1000    746763   8136.00      0.00      0.00       0  docker-model
23:42:25     1000    746764   7180.00      0.00      0.00       0  docker-compose
23:42:25        0    746768   5864.00      0.00      0.00       0  runc
23:42:25        0    746769   2732.00      0.00      0.00       0  runc

23:42:25      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
23:42:26        0      1281  10224.00      0.00      0.00       0  dockerd
23:42:26        0    657208    788.00      0.00      0.00       0  containerd-shim
23:42:26        0    657232    816.00      0.00      0.00       0  kiro-go
23:42:26     1000    687151  15132.00      0.00      0.00       0  sub2api
23:42:26     1000    746727   1772.00      0.00      0.00       0  docker
23:42:26     1000    746762  11972.00      0.00      0.00       0  docker-buildx
23:42:26     1000    746763   6800.00      0.00      0.00       0  docker-model
23:42:26     1000    746764   8540.00      0.00      0.00       0  docker-compose
23:42:26        0    746768    560.00      0.00      0.00       0  runc
23:42:26        0    746769    580.00      0.00      0.00       0  runc
23:42:26        0    746795     64.00      0.00      0.00       0  6

23:42:26      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
23:42:27        0      1281   6328.00      0.00      0.00       0  dockerd
23:42:27        0    657232    908.00      4.00      0.00       0  kiro-go
23:42:27     1000    687151  17180.00      0.00      0.00       0  sub2api
23:42:27       70    744104      0.00     16.00      0.00       0  postgres
23:42:27     1000    746727   3256.00      0.00      0.00       0  docker
23:42:27     1000    746762   9692.00      0.00      0.00       0  docker-buildx
23:42:27     1000    746763   7536.00      0.00      0.00       0  docker-model
23:42:27     1000    746764  11000.00      0.00      0.00       0  docker-compose
23:42:27        0    746768    120.00      0.00      0.00       0  runc
23:42:27        0    746769    300.00      0.00      0.00       0  runc
23:42:27        0    746804    836.00      0.00      0.00       0  runc:[2:INIT]
23:42:27        0    746805      4.00      0.00      0.00       0  runc:[2:INIT]

可以看到读盘直接打满了我的小鸡限制。

于是我怀疑是2api服务的问题,一路从cpa换codex2api换sub2api,但一直都还是有这个问题,甚至我拿两台小鸡做负载均衡也不行。

api并发也低的离谱,rpm从未超过5,而且这个问题从来不随api并发数出现。

而我又不甘心把2api转到arm小鸡上,死磕了好几天。

直到我今天写另一个服务调用了docker exec pg_isready也出现了io风暴,而且可以稳定复现。

众所周知,当一个问题可以稳定复现时,他就不再是问题了:


遂加了1g zram和2g swap,终于解决这一心头大患。

再让AI帮我做了个复现

另外,helper是我针对sub2api的at总是掉写的一个小工具,已经开源,做了个st2at。写死了很多个性化设置,放在这里主要是给大家一个思路,不建议直接使用。

另外,虽然本帖子目的不是推广,但还是写个声明:

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:

  • 我的帖子已经打上 开源推广 标签: 是
  • 我的开源项目完整开源,无未开源部分: 是
  • 我的开源项目已链接认可 LINUX DO 社区: 是
  • 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是
  • 以上选择我承诺是永久有效的,接受社区和佬友监督: 是
4 个赞