季兴 发布的文章

背景:
位于阿里云的kubernetes集群,通过ingress svc暴露,类型为ClusterIP。某天在对集群内大量缩容节点时,马上出现了大量的502、504报警
500告警.jpg

以为外部密集请求导致后端服务受影响,从监控观察并无异常,联想到最近的变更,怕不是缩容导致?正在排查的过程中,服务恢复。事后通过工单确认
ClusterIP类型的SLB后端的rs被移除时,SLB的操作就是静默丢包,也就是该SLB对任何发过来的tcp包都会默认丢弃,DROP并不会响应

  • 如果此时此链接是空闲链接,就会等待SLB设置的空闲链接超时时间,超过这个时间后,SLB断开链接
  • 如果此时此链接还有请求,由于SLB不会回ack包,客户端就会超时重传,重传的时间就取决于客户端或者内核的超时设置,比如内核ack默认会进行15次重传(net.ipv4.tcp_retries2=15),累加起来大概是924秒,JDBC URL支持设置SocketTimeout、ConnectTimeout,会在这个超时时间后断开重连

文档描述
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/add-annotations-to-the-yaml-file-of-a-service-to-configure-clb-instances
注解.jpg

最终解法

  • 代码中判断,失败重新建立连接
  • 在ingress中开启上述注解,缩短时间。并在谷值时缩容

早上看到一个粗看起来很简单的问题,“如何在crontab中增加每7分钟循环执行的任务”,下意识想不就是 */7。这么简单的问题怎么一堆回答。
先上结论,比如每7分钟,我10:40分添加的,

  • 第一次执行是在10:42,而不是下意识的10:47
  • 10:56最后一次执行,下一次执行是在11:00,而不是想象中的11:03

cron.jpg
也就破坏了需求中“每7分钟”,解决办法是每分钟执行,在脚本中判断当前时间

# 获取当前时间的分钟数
current_minute=$(date +"%M")

# 判断分钟数是否是7的倍数
if (( current_minute % 7 == 0 )); then
  # 如果是7的倍数,执行任务
  echo $(date +"%Y-%m-%d %H:%M:%S") >> /tmp/timestamp.txt
fi

背景:

我们有一款私有化部署系统,服务于用户购买的智能终端(简单理解为顺丰小哥手持的扫码枪)。周六接到端开发工程师反馈,此批设备续航异常,理论数据两周,但实际只有三至四天。
经过监测电量、抓包手段,电流的峰谷交替约为20秒电量消耗.jpg
端上抓包也显示每20秒收到来自服务器的keepalive报文,此原因导致设备无法休眠!

排查过程:

  1. 首先去服务端抓包,很清晰也能看到每20秒。当我看到抓包结果时,马上自信的答复,这是端上发来的keepalive包呀,肯定端上问题,不查端查服务器干嘛- -!keepalive包.jpg
  2. battle,端开发工程师回怼,“我抓包是从服务器端返回的”,仔细一看还真是。这时候懵圈,证据显示都是对方发来的,且正确响应
  3. 没头绪时,在想经历的中间环节。智能终端---aws NLB---mqtt服务器,NLB配置了标准的tls,卸载证书后转发到mqtt,功能测试都正常,且NLB用了这么久,不应该有问题
  4. 难道是运营商或者网络设备发送?想想不可能,tcp无法伪造IP,持续没头绪
  5. 中间环节只有NLB,进一步排查发现aws的NLB有区别于其他云的独特“机制”aws机制.jpg
  6. 接下来就是验证EIP直接暴露,问题消失。问题确认

总结:

aws NLB产品如果配置了tls监听,会主动20秒为周期发送keepalive!!!

客户端发送Keep-Alive包
AWS NLB行为时间线

时间点行为描述
第0秒客户端发送Keep-Alive包,NLB接收到并立即返回。
第20秒NLB发送Keep-Alive包到前端和后端。
第40秒NLB再次发送Keep-Alive包到前端和后端。
第60秒客户端再次发送Keep-Alive包,NLB接收到并重置计时。
第80秒NLB发送Keep-Alive包到前端和后端。
...重复每20秒发送Keep-Alive包的过程,直到客户端停止发送。

阿里云NLB行为时间线

时间点行为描述
第0秒客户端发送Keep-Alive包,NLB接收到并保持连接。
第60秒客户端再次发送Keep-Alive包,NLB接收到并保持连接。
第120秒客户端再次发送Keep-Alive包,NLB接收到并保持连接。
...重复每60秒发送Keep-Alive包的过程,直到客户端停止发送。

客户端不发送Keep-Alive包
AWS NLB行为时间线

时间点行为描述
第0秒客户端与NLB建立连接。
第350秒没有数据包发送,NLB关闭连接并发送TCP RST包。
第351秒连接关闭,客户端无法继续发送数据。

阿里云NLB行为时间线

时间点行为描述
第0秒客户端与NLB建立连接。
第900秒没有数据包发送,NLB关闭连接。
第901秒连接关闭,客户端无法继续发送数据。

在上一篇文档中实现了检查单台服务器故障的典型排错场景。此次我们加大难度
一、排查链路中故障,识别南北向流量走向并给出排查结果

  • 难点

    • 模型无法理解私有环境
    • 给出的建议具备安全风险
  • 思路

    • 结合提示词,使用function call功能来准确获取配置
    • 新增the_supervisor角色,对planer的建议安全过滤

二、与真实用户交流,给出域名申请建议并检测是否可用

  • 难点

    • 引导用户使用合规的子域名
  • 思路

    • 提示词约定规范,使用socket库来判断可用性

整体难点,多agent执行顺序,“技能绑定”,来看效果。图1为用户与gatekeeper探讨需求pic1.jpg
图2为agent建议用户使用的解析记录pic2.jpg
图3为正确路由南北向流量问题,并使用对应function判断pic3.jpg

关键代码片段
pic4.jpg

探索大模型在运维工作中的方向,此篇主要讲故障排查。是“Autogen 运维排错实践-复杂案例”的进一步整合,改进如下

  • 通过跳板机,不需要在目标机器安装agent,零侵入
  • 入口统一,集成在运维系统
  • 模型自由切换,GPT-4/Claude/tongyi等等

效果

用户在资产中选择目标机器
host_management.png
描述故障,选择策略(自动执行、逐步询问),点击执行
start_tr.png
输出结果
end_tr.png

方案设计

利用堡垒机与所有目标机器互通,将aiagent部署在此。通过提示词确认专精方向、连接方式。后端使用Django开启websocket,前端使用xterm.js模拟终端
topology.png

重点

  • Xterm.js学习曲线陡峭,捕获中文、英文、空格、回退,快捷键等均需要自定义。在即将完成时看到有封装更简单的项目webssh
  • Autogen中与openai通信使用了api.openai.com,改对应库中的域名至代理域名
  • websocket模式需要配置asgi使用,加载静态文件有差别。consumers.py和routing.py需自定义
  • AIagent中提示词需要明确,注意模型的上下文限制,通过提示词截取部分结果

- 阅读剩余部分 -

模型仅具备各领域的通用知识,对于垂类仍有进步空间,这也是医疗、政务类模型出现的原因。我们在尝试AIagent时发现模型并不够聪明,对于安装性能分析工具,vim前后台等问题无法进展到下一步,详见 Autogen 运维排错实践-复杂案例。此次尝试使用偏运维领域的ServerFault,爬取经过人工审核的有效答案来微调模型,观察效果。简言之,教模型所不擅长

步骤

  1. 爬取ServerFault,筛选有效问答
  2. 微调模型
  3. AutoGen配置微调后模型

先看效果,根据采集到的数据,统计出ServerFault热门词云
ciyun-new.jpg

爬虫

筛选逻辑,根据Active状态&前500页&作者vote过的问题,分别记录问题链接、标题、内容、发布时间、更新时间、被查看总数、投票总数;答案内容、得分9个字段,两张表通过外键关联

CREATETABLE Posts (
    PostID INTEGERPRIMARYKEY,
    PostLink TEXTNOTNULL,
    Title TEXTNOTNULL,
    PostContent TEXTNOTNULL,
    PostTime TEXTNOTNULL,-- ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS")
    ModifyTime TEXTNOTNULL,
    ViewCount INTEGERNOTNULL,
    VoteCount INTEGERNOTNULL
);
CREATETABLE Answers (
    AnswerID INTEGERPRIMARYKEY,
    PostID INTEGER,
    AnswerContent TEXTNOTNULL,
    VoteCount INTEGERNOTNULL,
FOREIGNKEY(PostID)REFERENCES Posts(PostID)

);NO;

经过控制爬虫速率,切换代理地址,共采集问题、答案数

数量
Posts6681
Answers16253

VoteCount分布

0-100101-200201-300301-400401-500>500
Posts627885321315
Answers15643150311678

- 阅读剩余部分 -

让查数据这件事,不再是高高在上、遥不可及的技能,而是人人都能玩得转,妙趣横生的小技巧。比如“我的店上周赚了多少钱?哪个商品即将售罄?这个月卖的最多的商品是啥?”,下一秒,答案就像变魔术一样蹦出来。直接看效果

流程如下,

  • 前端使用gradio,采集麦克风声音
  • 后端收到声音,使用openai的speech-to-text
  • 文字通过dbgpt(链接各种自定义模型),转换为sql进行数据库查询
  • 返回对应数据

关键代码

- 阅读剩余部分 -

需求如下,产品团队高频要求翻译团队给出符合标准的翻译件,比如翻译产品文档,其中又有大量的术语,比如3D结构光、扫码头、主屏、客显屏、立式等(在公司内有统一的标准叫法),使用市面通用的翻译产品需要自己修改。看效果
翻译效果.jpg

原理如图
Retrieval.png

openai负责文档Retrieval,flowise负责功能补充,同时做了一次封装,gradio负责提供展示页面,方便用户交互

gradio_run.py

import gradio as gr
import requests
import json

def call_api(question):
    url = "https://xxxx.com/api/v1/prediction/asdasce1-5a7b-4d9e-9ed6-21a9aaaab2"
    headers = {"Content-Type": "application/json"}
    data = {"question": question}
    response = requests.post(url, headers=headers, data=json.dumps(data))
    return response.json().get("text", "No response text found.")

iface = gr.Interface(
    fn=call_api,
    inputs="text",
    outputs="text",
)

iface.launch()

一直有个需求,企业内私有知识库RAG,“陪产假怎么申请?”,“公司发票抬头是啥?”等问题,解放行政、人事的部分人力。偶然发现钉钉“智能员工”非常契合。零代码开发、配置简单。看效果,支持单聊群聊。目前免费!
RAG-01.jpg
RAG-02.jpg

配置方式,登录钉钉开发者-数字员工,类似flowise编辑langchain的每个环节,别担心,有模板只需要简单修改!在知识库贴钉文档的链接。文档准备需要注意以下几点

  1. 主题、内容紧密相关
  2. 段落清晰,一段文字不超过500字,长文本可以拆成多段
  3. QA优先级最高
  4. 用标准中文,反对“互联网黑话”
  5. 单文件不超10mb
  6. 通义模型基于中文,中文提示词效果更好
  7. 温度尽可能低,0.1

钉钉AI.jpg

产品名: No English - 不学英语 https://chat.openai.com/g/g-kkrKOWa1E-no-english

产品概览: No English - 您的个人化英语学习伙伴

产品定位:
在语言学习的长河中,No English 站在了技术与教育的交汇点,提供了一个创新的、用户友好的英语学习解决方案。我们的平台运用最新的人工智能技术,致力于提升英语学习效率,同时保持学习过程的趣味性和参与度。

核心功能:

  1. 每日单词学习: 我们的系统每天精选实用词汇,配以例句和上下文,确保用户不仅记住单词,而且理解其应用。
  2. 定制化复习计划: 基于先进的记忆算法,No English 会提供个性化的复习计划,帮助用户巩固记忆,减少遗忘。
  3. 每日英语句型: 别名:"每天学点装比词汇😄 ",从日常对话到商务沟通,我们提供广泛的句型训练,以强化用户的实际应用能力。
  4. 学习动力激励: 别名:“今天踏马不想学了😕”,针对学习疲劳的用户,No English 提供及时的正能量和学习建议,激发学习激情。

知识资源库:
No English 配备了一系列的英语学习文件,涵盖商务英语和各类英语测试标准,如TEM-8、CET-4和CET-6,可供用户根据个人需要下载并学习。

技术能力:

  • 网页浏览: 无缝接入互联网资源,支持用户在学习中实时查询和获取信息。
  • DALL·E图像生成: 利用尖端的图像生成技术,为学习内容添加视觉元素,提高记忆点。
  • 代码解释器: 高级代码解释功能,为用户提供编程学习中的实时反馈。

用户动作与互动:
用户询问当日新闻时,会从指定接口请求,本app使用京东的汇聚新闻接口。

使用推荐:
No English 针对希望在移动设备上学习的用户进行了优化设计,特别推荐使用手机应用来体验我们的语音互动特性,这能够为用户提供更加沉浸式的学习环境。 手机端前两天还支持,现在已经不行了

app.jpg
app2.jpg