0%

深入解析 “nf_conntrack: table full, dropping packet” 报错及解决方案

在高并发网络场景中,Linux 服务器有时会出现 nf_conntrack: table full, dropping packet 错误,导致应用连接失败(如 MySQL 通信链路中断)。本文将从原理、参数、解决方案三个维度详细解析该问题,帮助彻底解决此类网络故障。

问题本质:连接跟踪表耗尽

1. nf_conntrack 模块的作用

nf_conntrack 是 Linux 内核中的连接跟踪模块,主要用于:

  • 跟踪网络连接的状态(如 TCP 连接的建立、关闭、超时等);
  • 在 NAT(网络地址转换)场景下,记录源 / 目标 IP、端口等信息,确保数据包能正确转发;
  • 为防火墙(如 iptables)提供连接状态信息(如 --state ESTABLISHED 规则)。

该模块通过哈希表存储连接信息,每条记录包含连接的源地址、目标地址、端口、协议、状态等关键信息。

2. 报错原因:哈希表容量不足

当系统中的网络连接数量超过 nf_conntrack_max(哈希表最大条目数)时,哈希表会被填满,新的连接无法被跟踪,内核会丢弃新连接的数据包,从而触发 nf_conntrack: table full, dropping packet 错误。

在高并发场景下(如用户提到的 “访问量较高的项目”),默认参数极易触发该问题:

  • 默认 nf_conntrack_max 通常为 65535(受系统内存限制,小内存机器可能更低);
  • 默认 nf_conntrack_tcp_timeout_established(已建立连接的超时时间)为 432000 秒(5 天),意味着即使连接已闲置,仍会在哈希表中保留 5 天,长期占用条目。

关键参数解析

阅读全文 »

视频缩略图生成全指南:基于 JavaCV 与 FFmpeg 的实战方案

在视频管理系统中,缩略图是提升用户体验的关键元素,用于列表预览、详情页展示等场景。本文将详细讲解如何使用 JavaCV(封装 FFmpeg) 实现视频缩略图生成,包括依赖配置、核心代码实现、优化技巧及常见问题解决,帮助你快速集成视频缩略图功能。

技术选型:为何选择 JavaCV + FFmpeg?

生成视频缩略图的方案有多种,对比后 JavaCV + FFmpeg 成为首选:

方案 优势 劣势
JavaCV + FFmpeg 支持几乎所有视频格式,处理能力强,可定制化高 依赖稍大,需理解基础视频概念
Xuggle 轻量易用 已停止维护,对新格式支持不足
本地调用 FFmpeg 命令 无需 Java 依赖,直接复用 FFmpeg 功能 跨平台兼容性差,进程管理复杂
纯 Java 库(如 MP4Parser) 无 native 依赖,部署简单 仅支持少数格式(如 MP4),功能有限

结论:JavaCV 基于 FFmpeg 封装,兼顾功能完整性和 Java 易用性,适合生产环境使用。

环境配置与依赖引入

Maven 依赖配置

JavaCV 通过 Maven 引入,核心依赖包括 javacv 和 FFmpeg 平台包(自动适配不同操作系统):

阅读全文 »

线上问题排查全流程:从现象到根源的系统分析

线上系统出现故障时,快速定位问题根源是核心目标。本文基于 “分层排查、聚焦瓶颈” 的思路,详细介绍从 CPU、内存、网络、磁盘四个维度排查问题的步骤和工具,帮助高效解决线上故障。

第一步:CPU 使用率过高排查

CPU 是系统运行的核心,其使用率过高会直接导致系统卡顿、响应延迟。

确认 CPU 瓶颈

使用 top 命令实时监控 CPU 状态:

1
top  # 进入界面后按 P 键按 CPU 使用率排序
  • 关键指标:顶部%Cpu行的%idle(空闲 CPU 百分比)。
    • %idle 长期 < 10%:表示 CPU 资源紧张。
    • %us(用户态 CPU)或 %sy(系统态 CPU)长期 > 80%:需定位具体进程。

定位高 CPU 进程

  • top 界面中,%CPU 列显示单个进程的 CPU 占用率,记录高占用进程的 PID

  • 针对 Java 进程,可进一步分析线程栈:

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看进程内线程的 CPU 占用(PID 为目标进程 ID)
    top -Hp PID

    # 将线程 ID 转换为十六进制(用于 jstack 定位)
    printf "%x\n" 线程ID

    # 导出进程栈信息,查找对应线程的调用栈
    jstack PID | grep 十六进制线程ID -A 30
  • 常见原因:死循环、频繁 GC、大量计算任务等,需结合业务代码优化。

第二步:内存不足排查

阅读全文 »

Log4j2 动态修改日志级别:线上问题排查的灵活工具

在生产环境中,日志级别通常设置为INFOWARN以减少冗余输出,但排查问题时往往需要临时调低级别(如DEBUG)以获取更详细的日志。Log4j2 提供了Configurator工具类,支持在不重启应用的情况下动态修改日志级别,极大提升了线上问题排查的效率。

动态修改日志级别的核心原理

Log4j2 的日志级别配置通过LoggerContext管理,每个Logger(对应类或包)的级别信息存储在内存中。Configurator类提供了静态方法setLevel(),可直接修改指定Logger的级别,无需重新加载配置文件。

  • 核心对象:
    • LoggerContext:Log4j2 的上下文对象,管理所有Logger配置;
    • Level:日志级别枚举(TRACE < DEBUG < INFO < WARN < ERROR < FATAL)。

动态修改日志级别的实现

核心 API

Log4j2 通过org.apache.logging.log4j.core.config.Configurator提供动态配置能力,关键方法:

方法 说明
Configurator.setLevel(String loggerName, Level level) 为指定名称的Logger(类或包)设置级别
LogManager.getContext(false) 获取当前应用的LoggerContext(非单例模式)
loggerContext.getLogger(loggerName) 获取指定名称的Logger实例

实现代码(Spring Boot 示例)

以下示例通过 HTTP 接口实现日志级别的查询与修改,便于线上操作:

阅读全文 »

Python JSON 解析详解:日志分析实战

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在日志记录、API 交互等场景中广泛使用。Python 标准库 json 提供了简洁的 API 用于 JSON 数据的解析(字符串转字典)和序列化(字典转字符串)。本文将以日志分析为例,详细介绍 Python 处理 JSON 数据的方法。

JSON 解析核心方法

Python 的 json 模块提供了两个核心函数用于 JSON 处理:

方法 功能 适用场景
json.loads(s) 将 JSON 字符串 s 解析为 Python 字典 / 列表 处理内存中的 JSON 字符串(如日志行)
json.dumps(obj) 将 Python 字典 / 列表序列化为 JSON 字符串 将数据写入文件或通过网络传输
json.load(f) 从文件对象 f 中读取 JSON 数据并解析 直接读取 JSON 文件
json.dump(obj, f) 将 Python 对象序列化并写入文件 f 直接写入 JSON 文件

日志分析实战:筛选慢请求

以分析 JSON 格式的请求日志为例,假设日志文件 req_resp.log 中每行是一个 JSON 对象,包含 timeSpent(请求耗时,单位 ms)等字段。我们需要筛选出耗时超过 150ms 的请求。

完整代码实现

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
#!/usr/bin/python3
import json

# 日志文件路径
log_path = "/data/req_resp.log"

# 打开文件并逐行解析
with open(log_path, "r", encoding="utf-8") as f:
for line_num, line in enumerate(f, 1): # 枚举行号(从1开始)
try:
# 解析 JSON 字符串为字典
log_data = json.loads(line.strip()) # strip() 去除换行符等空白

# 检查是否包含 timeSpent 字段
if "timeSpent" not in log_data:
print(f"警告:第 {line_num} 行缺少 timeSpent 字段")
continue

# 获取耗时并筛选
time_spent = log_data["timeSpent"]
# 确保 timeSpent 是数字(避免类型错误)
if isinstance(time_spent, (int, float)) and time_spent > 150:
print(f"慢请求(耗时 {time_spent}ms):{log_data}")

except json.JSONDecodeError as e:
# 处理 JSON 解析错误(如格式错误)
print(f"解析错误(第 {line_num} 行):{e}")
except Exception as e:
# 处理其他异常(如字段类型错误)
print(f"处理错误(第 {line_num} 行):{e}")
阅读全文 »