Blame view

offline_tasks/RUN_SCRIPT_GUIDE.md 6 KB
db578127   tangwang   offline tasks: me...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
  # run.sh 运行脚本使用指南
  
  ## 概述
  
  `run.sh` 是一个自动化运行脚本,集成了内存监控功能,确保离线任务安全高效运行。
  
  ## 主要特性
  
  ### 1. 内存监控
  - **警告阈值**: 25GB - 打印警告日志
  - **强制终止阈值**: 30GB - 自动kill进程
  - **检查频率**: 每10秒检查一次
  - **日志文件**: `logs/memory_monitor.log`
  
  ### 2. 任务流程
  1. 清理旧进程和输出
  2. 运行调试模式(小数据量测试)
  3. 运行生产模式(大数据量)
  4. 加载索引到Redis
  
  ### 3. 错误处理
  - 任何步骤失败会立即退出
  - 显示详细的退出码
  - 保存完整日志
  
  ## 使用方法
  
  ### 基本运行
  ```bash
  cd /home/tw/recommendation/offline_tasks
  ./run.sh
  ```
  
  ### 查看实时输出
  ```bash
  ./run.sh | tee logs/run_$(date +%Y%m%d_%H%M%S).log
  ```
  
  ### 后台运行
  ```bash
  nohup ./run.sh > logs/run_$(date +%Y%m%d_%H%M%S).log 2>&1 &
  ```
  
  ## 内存监控说明
  
  ### 监控逻辑
  
  ```bash
  check_memory() {
      local pid=$1
      local threshold_warn=25  # 25GB警告
      local threshold_kill=30  # 30GB强制kill
      
      while 进程运行中; do
          获取内存使用
          
          if 内存 >= 30GB:
              打印错误日志
              强制终止进程
              break
          elif 内存 >= 25GB:
              打印警告日志
          
          sleep 10秒
      done
  }
  ```
  
  ### 日志格式
  
  **警告日志**:
  ```
  [2025-10-17 14:30:25] ⚠️  内存警告!当前使用: 26.45GB (>= 25GB), PID=12345
  ```
  
  **强制终止日志**:
  ```
  [2025-10-17 14:35:30] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12345
  ```
  
  ### 查看监控日志
  ```bash
  # 实时查看
  tail -f logs/memory_monitor.log
  
  # 查看历史
  cat logs/memory_monitor.log
  ```
  
  ## 运行流程
  
  ### 步骤1: 调试模式
  ```bash
  python3 run_all.py --debug
  ```
  - 使用默认参数(见 `offline_config.py`
  - 输出保存到 `output_debug/`
  - 启动内存监控
  
  ### 步骤2: 生产模式
  ```bash
  python3 run_all.py --debug
  ```
  - 生成完整索引
  - 输出保存到 `output/`
  - 启动内存监控
  
  ### 步骤3: 加载Redis
  ```bash
  python3 scripts/load_index_to_redis.py --redis-host localhost
  ```
  - 加载所有生成的索引
  - 包括新增的内容相似索引
  
  ## 输出示例
  
  ```
  ======================================================================
  开始运行离线任务 - 2025-10-17 14:00:00
  内存监控: 警告阈值=25GB, 强制终止阈值=30GB
  ======================================================================
  
  >>> 步骤1: 调试模式运行(小数据量)
  调试任务 PID: 12345
  ✓ 调试模式完成
  
  >>> 步骤2: 生产模式运行(大数据量)
  生产任务 PID: 12346
  [2025-10-17 14:30:25] ⚠️  内存警告!当前使用: 26.45GB (>= 25GB), PID=12346
  ✓ 生产模式完成
  
  >>> 步骤3: 加载到Redis
  ✓ Redis加载完成
  
  ======================================================================
  所有任务完成 - 2025-10-17 16:30:00
  ======================================================================
  ```
  
  ## 自定义配置
  
  ### 修改内存阈值
  
  编辑 `run.sh` 中的以下行:
  ```bash
  local threshold_warn=25  # 修改警告阈值
  local threshold_kill=30  # 修改强制kill阈值
  ```
  
  ### 修改检查频率
  
  编辑 `run.sh` 中的以下行:
  ```bash
  sleep 10  # 修改为其他秒数
  ```
  
  ### 跳过调试模式
  
  注释掉步骤1相关代码:
  ```bash
  # # 3. 调试模式运行(小数据量)
  # echo ""
  # echo ">>> 步骤1: 调试模式运行(小数据量)"
  # python3 run_all.py --debug &
  # ...
  ```
  
  ### 修改Redis配置
  
  修改步骤3的参数:
  ```bash
  python3 scripts/load_index_to_redis.py \
    --redis-host your-redis-host \
    --redis-port 6379 \
    --redis-db 0
  ```
  
  ## 故障排查
  
  ### 内存持续超限
  
  **原因**:
  - 数据量太大
  - 内存泄漏
  - 并发任务过多
  
  **解决方案**:
  1. 增加内存阈值(临时方案)
  2. 优化代码减少内存占用
  3. 分批处理数据
  4. 使用增量更新
  
  ### 进程被意外终止
  
  **检查日志**:
  ```bash
  # 查看监控日志
  cat logs/memory_monitor.log
  
  # 查看任务日志
  ls -lht logs/
  cat logs/run_all_*.log
  ```
  
  ### 任务失败
  
  **查看退出码**:
  - 0: 成功
  - 1: 一般错误
  - 137: 被kill信号终止(可能是内存超限)
  - 其他: 查看具体错误信息
  
  ## 监控建议
  
  ### 1. 添加系统监控
  ```bash
  # 安装监控工具
  apt install htop iotop
  
  # 实时监控
  htop -p $(pgrep -f run_all.py)
  ```
  
  ### 2. 设置告警
  ```bash
  # 配置邮件告警
  if [ $PROD_EXIT_CODE -ne 0 ]; then
      echo "任务失败" | mail -s "离线任务告警" admin@example.com
  fi
  ```
  
  ### 3. 定时任务
  ```bash
  # 添加到crontab
  0 2 * * * /home/tw/recommendation/offline_tasks/run.sh >> /var/log/offline_tasks.log 2>&1
  ```
  
  ## 性能优化
  
  ### 内存优化建议
  
  1. **分批处理**
     ```python
     # 在代码中使用batch处理
     batch_size = 1000
     for i in range(0, len(items), batch_size):
         batch = items[i:i+batch_size]
         process(batch)
     ```
  
  2. **及时释放**
     ```python
     import gc
     del large_object
     gc.collect()
     ```
  
  3. **使用生成器**
     ```python
     def process_items():
         for item in items:
             yield process(item)
     ```
  
  ## 日志管理
  
  ### 日志文件
  - `logs/memory_monitor.log` - 内存监控日志
  - `logs/run_all_YYYYMMDD.log` - 任务运行日志
  - `output/` - 生成的索引文件
  - `output_debug/` - 调试模式输出
  
  ### 清理旧日志
  ```bash
  # 保留最近7天
  find logs/ -name "*.log" -mtime +7 -delete
  
  # 压缩旧日志
  find logs/ -name "*.log" -mtime +3 -exec gzip {} \;
  ```
  
  ## 安全注意事项
  
  1. **权限**: 确保脚本有执行权限 `chmod +x run.sh`
  2. **路径**: 使用绝对路径避免混淆
  3. **清理**: 脚本会清理旧进程,确保没有重要进程被误杀
  4. **备份**: 脚本会删除output目录,请提前备份重要数据
  
  ## 总结
  
  `run.sh` 提供了:
  - ✅ 自动化运行流程
  - ✅ 内存监控保护
  - ✅ 详细日志记录
  - ✅ 错误处理机制
  - ✅ 进度显示
  
  建议在生产环境使用前先在测试环境验证。
  
  ---
  
  **更新时间**: 2025-10-17  
  **版本**: v2.0