开源数字人平替方案
测试了音频驱动肖像动画的框架,https://github.com/jixiaozhong/Sonic 眨眼、皱眉、微笑、扭动都很自然。适用口播视频、数字人、介绍视频。看效果
- 显卡:4090
- 显存占用:15G
- 推理时长:10m42.728s
原始图片,肖战粉丝不要打我:)
测试了音频驱动肖像动画的框架,https://github.com/jixiaozhong/Sonic 眨眼、皱眉、微笑、扭动都很自然。适用口播视频、数字人、介绍视频。看效果
原始图片,肖战粉丝不要打我:)
在今年的大模型落地背景下,敏感信息不和共有模型交互。我们分别评测了 A100 8卡、4090、H800、H20,动辄百万级,在前期探索阶段很难拿到产出数据支撑。
梳理需求后发现,90%场景是推理,只有AI部门涉及训练任务。推理性能和性价比成为重点。
此时注意到,Mac Studio在M2 Ultra芯片上采用了统一内存架构(内存≈显存),可用于推理大型模型。油管也已有博主实测运行 deepseek-R1:671b。
最终选择购入最新的M3 Ultra Mac Studio
价格不到7万。实测默认参数下,可以运行 deepseek-R1:671b,30个并发响应轻松,推理速度可接受。
Mac Studio并不是为全天候服务器设计
虽然推理能力超出预期,但Mac Studio天生不适合全天候服务器,主要存在以下问题:
launchctl
手动配置。稳定运行的必要设置
为了最大化稳定性,必须手动关闭系统的各种休眠机制:
# 防止系统进入睡眠
sudo systemsetup -setcomputersleep Never
# 防止显示器睡眠
sudo systemsetup -setdisplaysleep Never
# 防止硬盘休眠
sudo systemsetup -setharddisksleep Never
# 验证配置
systemsetup -getcomputersleep
systemsetup -getdisplaysleep
systemsetup -getharddisksleep
# 设置Ollama监听所有IP地址
launchctl setenv OLLAMA_HOST "0.0.0.0"
# 调整GPU共享内存限制,必选!否则大尺寸模型跑不起来
sudo sysctl iogpu.wired_limit_mb=491520
在 deepseek-r1:32b 中小尺寸模型下,A100 单卡可提供 1.8QPS,单问题 7 秒内完成响应。 对于小团队够用。 单卡推理比4090弱
ab -n 1000 -c 10 -s 30000 -T "application/json" -p payload.json -v 4 http://1.1.1.1:11434/v1/completions > ab_detailed_log01.txt 2>&1
# payload.json
{
"model": "deepseek-r1:32b",
"prompt": "你好,你是谁?"
}
并发数 | 总请求数 | 成功请求数 | 失败请求数 | 吞吐率 (请求/秒) | 平均响应时间 (毫秒) | 95% 响应时间 (毫秒) | 最长响应时间 (毫秒) |
---|---|---|---|---|---|---|---|
10 | 1000 | 1000 | 0 | 1.82 | 5504.495 | 7001 | 8423 |
50 | 1000 | 1000 | 0 | 1.82 | 27520.991 | 29506 | 32275 |
100 | 1000 | 1000 | 0 | 1.83 | 54613.030 | 57132 | 58628 |
150 | 1000 | 1000 | 0 | 1.81 | 82645.294 | 87170 | 90249 |
200 | 1000 | 1000 | 0 | 1.82 | 110118.858 | 113820 | 117009 |
400 | 1000 | 1000 | 0 | 1.82 | 220315.946 | 222405 | 224113 |
800 | 1000 | 1000 | 0 | 1.24 | 644384.462 | 688739 | 698507 |
8卡A100,可运行deepseek-r1:671b(671b-q4_K_M 404GB),响应较慢
指标 | GoDaddy | 国内厂商 |
---|---|---|
新顶级域支持 | 实时开放注册(.dev/.app/.io等) | 暂不支持 |
备案要求 | 无 | 有(法规要求),未备案部分解析功能受限 |
特性 | GoDaddy | 国内云 |
---|---|---|
协议支持 | 同时支持HTTP HTTPS | 仅支持HTTP明文跳转 |
证书管理 | 自动续签(ACME协议集成) | 需手动上传第三方证书 |
协议测试:
# GoDaddy HTTPS重定向验证
curl -v https://test.dev
输出字段可以看到自动帮你加了godaddy颁发证书
在deepseek-r1:32b较大尺寸模型下,4090单卡可提供3QPS,单问题4.4秒内完成响应。 对于个人,几十人小团队够用。
优点:
缺陷:
服务器硬件配置:
ab -n 1000 -c 10 -s 30000 -T "application/json" -p payload.json -v 4 http://1.1.1.1:11434/v1/completions > ab_detailed_log01.txt 2>&1
- **请求总数**:1000
- **并发数**:逐渐升高
- **超时设置**:30秒(`-s 30000`)
- **请求类型**:POST,传送JSON格式的负载
{
"model": "deepseek-r1:32b",
"prompt": "你好,你是谁?"
}
并发数 | 总请求时间(秒) | 成功请求数 | 失败请求数 | 吞吐量 (请求/秒) | 平均响应时间 (毫秒) | 最大响应时间 (毫秒) | 95% 响应时间 (毫秒) |
---|---|---|---|---|---|---|---|
10 | 344.899 | 1000 | 0 | 2.90 | 3448.99 | 7073 | 4424 |
50 | 341.55 | 1000 | 0 | 2.93 | 17077.494 | 20274 | 18333 |
100 | 343.880 | 1000 | 0 | 2.91 | 34387.977 | 39523 | 35580 |
150 | 337.687 | 1000 | 0 | 2.96 | 50653.032 | 53134 | 51942 |
200 | 340.978 | 1000 | 0 | 2.93 | 68195.508 | 70733 | 69537 |
400 | 351.865 | 1000 | 0 | 2.84 | 140746.048 | 141672 | 139774 |
800 | 250.261 | 716 | 284 | 4 | 200208.529 | 249642 | 231555 |
本地部署DeepSeek-Coder-V2-Lite-Instruct:14b。要求基础的高可用、监控、安全能力。ollama默认只能使用第一张显卡,多个模型同时调用会有bug(ollama ps显示100GPU,但使用CPU推理);无法高可用
多GPU Ollama部署方案,通过系统服务化+负载均衡实现4块4090显卡的并行利用,边缘使用nginx负载均衡。
服务器硬件配置:
# 备份ollama
cd /etc/systemd/system/
mv ollama.service ollama.service.bak
# 创建4个独立服务文件(每个GPU对应一个端口)
for i in {0..3}; do
sudo tee /etc/systemd/system/ollama-gpu${i}.service > /dev/null <<EOF
[Unit]
Description=Ollama Service (GPU $i)
[Service]
# 关键参数配置
Environment="CUDA_VISIBLE_DEVICES=$i"
Environment="OLLAMA_HOST=0.0.0.0:$((11434+i))"
ExecStart=/usr/local/bin/ollama serve
Restart=always
User=ollama
Group=ollama
[Install]
WantedBy=multi-user.target
EOF
done
# 重载服务配置
sudo systemctl daemon-reload
# 启动所有GPU实例
sudo systemctl start ollama-gpu{0..3}.service
# 设置开机自启
sudo systemctl enable ollama-gpu{0..3}.service
nginx 需要编译额外模块,用于健康检查
root@sunmax-AIGC-01:/etc/systemd/system# nginx -V
nginx version: nginx/1.24.0
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --with-http_ssl_module --add-module=./nginx_upstream_check_module
# /etc/nginx/sites-available/mga.maxiot-inc.com.conf
# 在http块中添加(如果放在server外请确保在http上下文中)
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'RT=$request_time URT=$upstream_response_time '
'Host=$host Proto=$server_protocol '
'Header={\"X-Forwarded-For\": \"$proxy_add_x_forwarded_for\", '
'\"X-Real-IP\": \"$remote_addr\", '
'\"User-Agent\": \"$http_user_agent\", '
'\"Content-Type\": \"$content_type\"} '
'SSL=$ssl_protocol/$ssl_cipher '
'Upstream=$upstream_addr '
'Request_Length=$request_length '
'Request_Method=$request_method '
'Server_Name=$server_name '
'Server_Port=$server_port ';
upstream ollama_backend {
server 127.0.0.1:11436;
server 127.0.0.1:11437;
}
server {
listen 443 ssl;
server_name mga.maxiot-inc.com;
ssl_certificate /etc/nginx/ssl/maxiot-inc.com.pem;
ssl_certificate_key /etc/nginx/ssl/maxiot-inc.com.key;
# 访问日志
access_log /var/log/nginx/mga_maxiot_inc_com_access.log detailed;
# 错误日志
error_log /var/log/nginx/mga_maxiot_inc_com_error.log;
# 负载均衡设置,指向 ollama_backend
location / {
proxy_pass http://ollama_backend; # 会在两个服务器之间轮询
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
deepseek的爆火,官网验证后效果确实不错,中文能力强,“会说人话”。唯一缺陷是经常服务器繁忙,本地使用ollama即可下载使用,因为要详细压测,下载了不同尺寸的所有模型。
此方法不止适用deepseek,所有模型通用
此方法不止适用deepseek,所有模型通用
本地下载模型时,下载速度不稳定,会中断
常见的几种下载模型方式
ollama pull deepseek-r1:70b
优势:下载后直接使用;缺陷:速度慢,经常中断pip install modelscope
#下载完整模型
modelscope download --model AI-ModelScope/DeepSeek-Coder-V2-Lite-Instruct-GGUF
#下载特定文件
modelscope download --model AI-ModelScope/DeepSeek-Coder-V2-Lite-Instruct-GGUF README.md --local_dir ./dir
#仅下载文件夹
git clone --no-checkout https://www.modelscope.cn/AI-ModelScope/DeepSeek-Coder-V2-Lite-Instruct-GGUF.git
cd DeepSeek-Coder-V2-Lite-Instruct-GGUF
#仅下载所需文件
git lfs fetch --include="DeepSeek-Coder-V2-Lite-Instruct-Q6_K.gguf"
#恢复文件
git lfs checkout DeepSeek-Coder-V2-Lite-Instruct-Q6_K.gguf
#创建模型文件
echo "FROM DeepSeek-Coder-V2-Lite-Instruct-GGUF" > Modelfile
#创建模型
ollama create DeepSeek-Coder-V2-Lite-Instruct:14b -f Modelfile
#使用
ollama run DeepSeek-Coder-V2-Lite-Instruct:14b
由多个agent组成的SRE专家组,代替人工进行准确的故障分析!👽
流程:从用户输入取时间范围(支持上传图片)、路由--》查询日志中心--》获取网关中cmdb信息--》查询CMDB获取更多细节(owner、变更、jenkins、gitlab信息)--》分析并给出建议:
执行效果:
图中是判断某接口504故障,从依据到结论过程
使用flowise,配置langchain中AgentFlow
近期借一位业内朋友推荐,面试了一家位于新加坡的互联网企业,同样记录面试过程
一面(远程):
业务线运维负责人,是一位年轻女士,在问明不需要露脸后开始。从自我介绍到了解的技术栈,擅长的方向,排错问题等。问到“擅长的方向”时,忽然一愣,眼瞅也是17年的老运维人了,但还真没觉得擅长什么。只能说阶段性的尝试过一些新技术,23年至今,甚至有点不务正业,可以不负责任的说,“运维里最了解大模型的,大模型里最了解运维”的复合型人才:) 接触越多也愈发觉得知之甚少,这也是我在简历中不敢用“精通”二字。收回来,讲了几个模型应用的实际案例
23年以前,容器、网格、网关的落地、使用过程,举了几个排错。提到当前基础设施情况,使用了terraform,交流了优势和建议做法,terraform结合ansible快速拉起。在容器编排有更好的解法Cluster Autoscaler叠加Horizontal Pod Autoscaler。面试官最后礼貌的问了薪资,并贴心的补充可以不回答,基于信任,如实告知,一面结束,面试官准时,用时45分钟
二面(远程):
跨团队面试,一位男士,可能负责研发,同样的过程,自我介绍到过往经历。分享了几个经典、复杂的排错案例,也都是博客的历史文章。着重问了CDN厂商的从业经历,简历外有无其他经验,以往离开的原因等。二面结束,面试官因为凌晨处理故障到5点,迟到半小时,表示理解,实际用时49分钟
多年的运维感悟,什么阶段干什么事。这也是我在内部的运维规范里明确标明,“不提前优化”
我来谈谈几个阶段,
部分参考 原文链接:https://mp.weixin.qq.com/s/vVhLZDL6bRJL9u5GJg63tw
初创阶段,更多关注业务最小模型能否跑通
需要容量评估的场景
有些明显的规则要遵守,比如
这时候就要拆分了,上面提到的allinone可能已经有了性能、容量等压力。此时就要垂直拆分了
核心是基于业务的拆分
这时候我们要引入反向代理,最常见的如nginx,我的建议是用更加贴近业务的api网关,比如kong、apisix、openrestry等等,有更多原生功能。如果nginx比作汽车引擎,后者可以比作宝马、奔驰汽车,多了很多配置外,还能开车即用,开箱即用
创建一个具备内部运维知识,识别自然语义,准确调用各种工具执行任务,严格控制幻觉的智能运维工程师。
使用 OpenAI 的 Assistant 功能,上传知识库,设置提示词。
Prompt Engineering:
Function Call:通过 Flowise 的自定义工具
先看效果
Streamlit 界面:
LLM(大型语言模型)配置设置:
gpt-4o-2024-08-06
)。ollama/llama3:latest
)的配置。助手代理(AssistantAgent)和用户代理(UserProxyAgent):
AssistantAgent
,负责与用户输入进行处理和响应,同时集成在 Streamlit 中以显示聊天消息。UserProxyAgent
,用于接收用户输入,处理用户命令,并在助手代理与用户之间进行代理交互。实用工具函数:
get_url_info_from_kong
:从 Kong API 网关中查询 URL 的路由、服务和上游配置的信息,并返回格式化结果。dns_record_status
:检查给定 URL 的 DNS 记录状态。query_from_cmdb
:从 CMDB(配置管理数据库)中检索特定云服务提供商(如阿里云、AWS 等)的服务器、数据库和中间件实例的数量。异步聊天系统:
asyncio
),用户代理(User Proxy Agent)可以异步与助手代理(Assistant Agent)进行对话,提供更高效的交互体验。+---------------------------------------------------------------+
| Streamlit Interface |
|---------------------------------------------------------------|
| +-----------------------------------------------------------+ |
| | Sidebar (Azure Endpoint Config, etc.) | |
| +-----------------------------------------------------------+ |
| |
| +-----------------------------------------------------------+ |
| | Chat Input / Output Area | |
| | | |
| | User Input --> UserProxyAgent --> AssistantAgent | |
| | | |
| | AssistantAgent --> UserProxyAgent --> Output Display | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
+--------------------+ +--------------------+
| LLM Configurations | | Utility Functions|
|--------------------| |--------------------|
| - OpenAI (GPT-4) | | - get_url_info_from|
| - Local LLM (LLaMA)| | _kong() |
+--------------------+ | (Interacts with |
| Kong API Gateway)|
| - dns_record_status|
| (Checks DNS) |
| - query_from_cmdb |
| (Interacts with |
| CMDB Database) |
+--------------------+
+-----------------+ +-------------------+
| AssistantAgent | <--- asyncio ->| UserProxyAgent |
| (Handles LLM | | (Manages User |
| Requests) | | Input/Commands) |
+-----------------+ +-------------------+
^ | ^ |
| | | |
| v | v
+----------------+ +-------------------+
| LLM Config | | Utility Functions|
| Setup (OpenAI)| | (Kong, DNS, CMDB) |
+----------------+ +-------------------+
+----------------+
| Data Flow |
|----------------|
| - User Input |
| - Assistant |
| - ProxyAgent |
| - Utility Func|
+----------------+
超越简单的 RAG 和提示词工程:
使用 Function Call 完成真实世界的任务:
集成异步交互和高效任务处理:
asyncio
)实现用户代理和助手代理之间的异步通信,大幅提升了任务处理的效率和响应速度。这样的设计确保了系统能够并发处理多个任务,而不阻塞用户输入和系统响应。技术含量高,解决复杂场景问题:
get_url_info_from_kong
函数能够通过调用 Kong API,获取详细的路由、服务和插件信息,并对这些数据进行格式化处理和展示;query_from_cmdb
函数能够从 CMDB 中动态检索并整合不同云服务商的资源信息。这样的功能大大提升了系统的实际应用价值。提升企业运营效率与智能化水平:
最近在整理CMDB信息,以Jenkins为中枢,统计、梳理代码仓库位置、发布位置。形成以应用为中心,串连资源、管理者。
首先需要统计代码中涉及的配置文件信息,比如Mysql/Redis/Elasticsearch/MongoDB/Kafka/RocketMQ/MQTT/Doris/HBase/InfLuxDB/http等
意义:
相较传统的正则匹配,大模型加持下有如下优点
环境介绍
#!/bin/bash
# 设置环境变量
export CUDA_VISIBLE_DEVICES=0,1
# 启动 vllm 服务器并将其转移到后台运行
nohup python3 -m vllm.entrypoints.openai.api_server \
--model /data/vllm/Meta-Llama-3.1-8B-Instruct \
--served-model-name llama \
--tensor-parallel-size 2 \
--trust-remote-code > llama.log 2>&1 &
import os
import re
import requests
import time
# 定义中间件关键字的正则表达式,忽略大小写
KEYWORDS = ["mysql", "redis", "elasticsearch", "mongodb", "kafka", "rocketmq",
"rabbitmq", "emq", "mqtt", "nacos", "postgresql", "doris",
"hbase", "influxdb", "azkaban", "sls", "clickhouse",
"mse", "dataworks", "neo4j", "http", "gitlab", "jenkins"]
PATTERN = re.compile(r'\b(?:' + '|'.join(KEYWORDS) + r')\b', re.IGNORECASE)
def read_files(directory):
for root, _, files in os.walk(directory):
# 忽略 .git 文件夹
if '.git' in root:
continue
for file in files:
file_path = os.path.join(root, file)
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.readlines()
yield file_path, content
def extract_context(content, file_path):
results = []
for i, line in enumerate(content):
if PATTERN.search(line):
start = i # 从匹配到的行开始
end = min(i + 11, len(content)) # 包含匹配行及其下方10行
snippet = "".join(content[start:end]).strip()
results.append(f"文件路径: {file_path}\n{snippet}")
return results
def write_to_file(directory, contexts):
output_file = os.path.join(directory, 'matched_content.txt')
with open(output_file, 'w', encoding='utf-8') as f:
for context in contexts:
f.write(context + '\n' + '=' * 50 + '\n')
return output_file
def send_to_model(url, model_name, prompt, content):
headers = {"Content-Type": "application/json"}
data = {
"model": model_name,
"temperature": 0.2,
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"{prompt}\n\n{content}"}
]
}
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
except requests.RequestException as e:
print(f"Request to model failed: {e}")
return None
response_json = response.json()
if 'choices' not in response_json:
print(f"Model response does not contain 'choices': {response_json}")
return None
return response_json['choices'][0]['message']['content']
def write_individual_results(directory, results, model_name):
output_file = os.path.join(directory, f'{model_name}_results.txt')
with open(output_file, 'w', encoding='utf-8') as f:
for result in results:
f.write(result + '\n' + '=' * 50 + '\n')
return output_file
def combine_and_summarize(directory, llama_file, qwen_file, qwen_url):
combined_content = ""
# 读取llama和qwen的结果文件
with open(llama_file, 'r', encoding='utf-8') as f:
combined_content += f.read()
with open(qwen_file, 'r', encoding='utf-8') as f:
combined_content += f.read()
# 使用qwen模型进行汇总处理
summary_prompt = """
1. 删除包含“配置信息未提供”等无用信息的部分。
"""
result_summary = send_to_model(qwen_url, "qwen", summary_prompt, combined_content)
if result_summary:
summary_file = os.path.join(directory, 'final_summary_combined.txt')
with open(summary_file, 'w', encoding='utf-8') as f:
f.write(result_summary)
print(f"汇总结果保存至: {summary_file}")
else:
print("汇总处理失败")
def main(directory):
start_time = time.time()
all_contexts = []
for file_path, content in read_files(directory):
contexts = extract_context(content, file_path)
all_contexts.extend(contexts)
# 将匹配到的内容写入文件
matched_file = write_to_file(directory, all_contexts)
results_llama = []
results_qwen = []
with open(matched_file, 'r', encoding='utf-8') as f:
content = f.read()
analysis_prompt = """
1. Ignore lines starting with #, //, /**, or <!--.
2. Exclude commented lines.
3. Extract configuration info for: MySQL, Redis, Elasticsearch, MongoDB, Kafka, RocketMQ, RabbitMQ, EMQ, MQTT, Nacos, PostgreSQL, Doris, HBase, InfluxDB, Azkaban, SLS, ClickHouse, MSE, DataWorks, Neo4j, HTTP, HTTPS, GitLab, Jenkins.
4. Focus on URLs, usernames, passwords, hosts, ports, and database names.
5. Extract the following attributes:
- Username
- Password
- Host
- Port
- Database Name
- URL or Connection String
6. Look for configuration patterns like key-value pairs and environment variables.
7. Ensure extracted values are not in commented sections.
8. Extract all distinct configurations.
9. Handle different configuration formats (JSON, YAML, dictionaries, env variables).
10. Delete sections containing “**配置信息未直接提供**” or similar useless content.
"""
# 分别调用llama和qwen模型
result_llama = send_to_model("http://1.1.1.1:8000/v1/chat/completions", "llama", analysis_prompt, content)
result_qwen = send_to_model("http://1.1.1.1:8001/v1/chat/completions", "qwen", analysis_prompt, content)
if result_llama:
results_llama.append(result_llama)
if result_qwen:
results_qwen.append(result_qwen)
# 分别保存llama和qwen的结果到不同文件
llama_file = write_individual_results(directory, results_llama, "llama")
qwen_file = write_individual_results(directory, results_qwen, "qwen")
# 汇总llama和qwen的结果
combine_and_summarize(directory, llama_file, qwen_file, "http://1.1.1.1:8001/v1/chat/completions")
end_time = time.time()
total_duration = end_time - start_time
print(f"总耗时: {total_duration:.2f} 秒")
if __name__ == "__main__":
main("/Users/jixing/PycharmProjects/AIOps-utils/Athena_Legacy")
7月7日,收到来自CDN群的告警,当天带宽峰值较往日上涨600倍,进一步发现是某一宣传视频被反复下载,下载用户的IP集中,都是来自山西联通ADSL的一个C段。
通过带宽比较,6日开始就有下载,时间晚上八点开始,一直持续到夜间十一点。至此,初步的用户画像如下
两天账单被刷了
2万!😓
至此,没想明白这种损人不利己的行为。直到看到v2的一篇类似帖子(https://www.v2ex.com/t/1055510#reply27),pcdn用户手动制造下行流量,伪装成正常用户,妄图躲过运营商审查。鉴于对公司利益造成实际损失,联合安全同事决定报警,起码提醒对方不要再有此行为。提供资料后警方不予立案,理由如下
对我们提出的经济损失不予认可。不理解但尊重!!最终因为这一两例“老鼠屎”用户,全局限制了下载速度
背景:
位于阿里云的kubernetes集群,通过ingress svc暴露,类型为ClusterIP。某天在对集群内大量缩容节点时,马上出现了大量的502、504报警
以为外部密集请求导致后端服务受影响,从监控观察并无异常,联想到最近的变更,怕不是缩容导致?正在排查的过程中,服务恢复。事后通过工单确认 ClusterIP类型的SLB后端的rs被移除时,SLB的操作就是静默丢包,也就是该SLB对任何发过来的tcp包都会默认丢弃,DROP并不会响应
文档描述
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
最终解法
早上看到一个粗看起来很简单的问题,“如何在crontab中增加每7分钟循环执行的任务”,下意识想不就是 */7。这么简单的问题怎么一堆回答。
先上结论,比如每7分钟,我10:40分添加的,
也就破坏了需求中“每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秒
端上抓包也显示每20秒收到来自服务器的keepalive报文,此原因导致设备无法休眠!
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秒 | 连接关闭,客户端无法继续发送数据。 |
在上一篇文档中实现了检查单台服务器故障的典型排错场景。此次我们加大难度
一、排查链路中故障,识别南北向流量走向并给出排查结果
难点
思路
二、与真实用户交流,给出域名申请建议并检测是否可用
难点
思路
整体难点,多agent执行顺序,“技能绑定”,来看效果。图1为用户与gatekeeper探讨需求
图2为agent建议用户使用的解析记录
图3为正确路由南北向流量问题,并使用对应function判断
关键代码片段
探索大模型在运维工作中的方向,此篇主要讲故障排查。是“Autogen 运维排错实践-复杂案例”的进一步整合,改进如下
用户在资产中选择目标机器
描述故障,选择策略(自动执行、逐步询问),点击执行
输出结果
利用堡垒机与所有目标机器互通,将aiagent部署在此。通过提示词确认专精方向、连接方式。后端使用Django开启websocket,前端使用xterm.js模拟终端
模型仅具备各领域的通用知识,对于垂类仍有进步空间,这也是医疗、政务类模型出现的原因。我们在尝试AIagent时发现模型并不够聪明,对于安装性能分析工具,vim前后台等问题无法进展到下一步,详见 Autogen 运维排错实践-复杂案例。此次尝试使用偏运维领域的ServerFault,爬取经过人工审核的有效答案来微调模型,观察效果。简言之,教模型所不擅长
先看效果,根据采集到的数据,统计出ServerFault热门词云
筛选逻辑,根据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;
经过控制爬虫速率,切换代理地址,共采集问题、答案数
数量 | |
---|---|
Posts | 6681 |
Answers | 16253 |
VoteCount分布
0-100 | 101-200 | 201-300 | 301-400 | 401-500 | >500 | |
---|---|---|---|---|---|---|
Posts | 6278 | 85 | 32 | 13 | 1 | 5 |
Answers | 15643 | 150 | 31 | 16 | 7 | 8 |