程序员必备的十大技能(进阶版)之性能调优与故障排查(三)

简介: 教程来源 https://bgnno.cn/ 本节系统讲解网络与数据库性能问题排查:涵盖TCP连接状态分析、TIME_WAIT优化、延迟诊断、连接池配置;以及慢查询定位、索引失效识别、事务锁监控和连接池调优,助力高效定位并解决生产环境常见瓶颈。

五、网络问题排查

5.1 网络连接问题

# 1. 查看网络连接状态
netstat -antp | awk '{print $6}' | sort | uniq -c

# 状态分布:
# ESTABLISHED: 正常连接
# TIME_WAIT: 主动关闭后等待(过多说明频繁创建连接)
# CLOSE_WAIT: 被动关闭后未调用close(应用层bug)
# SYN_RECV: 半连接队列满

# 2. 查看TCP连接详情
ss -tni

# 3. 抓包分析
tcpdump -i eth0 -s 0 -w capture.pcap -c 1000

# 4. 分析抓包文件
tcpdump -r capture.pcap -nn
# 或使用Wireshark图形化分析

# 5. 检查端口监听
netstat -tlnp

5.2 TIME_WAIT过多问题

# 查看TIME_WAIT数量
netstat -ant | grep TIME_WAIT | wc -l

# 解决方案:
# 1. 开启端口复用
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
# 2. 减小FIN_WAIT2超时时间
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# 3. 使用连接池复用连接
# 4. 调整客户端为短连接时使用长连接

5.3 网络延迟排查

# 1. ping测试基础延迟
ping -c 10 target-host

# 2. traceroute查看路由跳数
traceroute target-host

# 3. mtr综合测试(实时显示丢包和延迟)
mtr target-host

# 4. 端到端延迟测试
iperf3 -c server -p 5201

# 5. 应用层延迟分析(客户端curl)
curl -w "@curl-format.txt" -o /dev/null -s https://api.example.com

# curl-format.txt内容:
# time_namelookup:  %{time_namelookup}\n
# time_connect:     %{time_connect}\n
# time_appconnect:  %{time_appconnect}\n
# time_pretransfer: %{time_pretransfer}\n
# time_redirect:    %{time_redirect}\n
# time_starttransfer: %{time_starttransfer}\n
# ----------\n
# time_total:       %{time_total}\n

5.4 连接池问题

// HTTP连接池配置示例(Apache HttpClient)
public class HttpClientPoolConfig {

    public CloseableHttpClient createOptimizedClient() {
        // 连接池配置
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(200);           // 最大连接数
        cm.setDefaultMaxPerRoute(50);  // 每个路由最大连接数

        // 请求配置
        RequestConfig config = RequestConfig.custom()
            .setConnectTimeout(3000)    // 连接超时
            .setSocketTimeout(5000)     // Socket超时
            .setConnectionRequestTimeout(1000) // 从连接池获取连接超时
            .build();

        // 空闲连接清理
        cm.setValidateAfterInactivity(1000);

        return HttpClientBuilder.create()
            .setConnectionManager(cm)
            .setDefaultRequestConfig(config)
            .setKeepAliveStrategy((response, context) -> 30000) // 30秒保活
            .evictIdleConnections(30, TimeUnit.SECONDS)
            .build();
    }
}

// 连接池问题排查:
// 1. 查看连接池监控指标(活跃连接数、空闲连接数)
// 2. 检查是否有连接泄漏(不归还连接)
// 3. 检查连接池大小是否合理

六、数据库性能优化

6.1 慢查询排查

-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = ON;

-- 查看慢查询日志位置
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 查看当前执行中的SQL
SHOW PROCESSLIST;
-- 或更详细的信息
SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep';

-- 查看锁等待
SELECT * FROM information_schema.INNODB_TRX;
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;

6.2 索引失效分析

-- 使用EXPLAIN分析执行计划
EXPLAIN FORMAT=JSON
SELECT o.*, u.name
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.create_time > '2024-01-01'
  AND o.status = 1
ORDER BY o.id DESC
LIMIT 100;

-- 关键指标解读:
-- type: ALL(全表扫描) > index(索引全扫) > range(范围) > ref(引用) > eq_ref > const > system
-- Extra: Using filesort(需优化) / Using temporary(需优化) / Using index(覆盖索引)

-- 索引使用情况统计
SELECT 
    index_name,
    cardinality,
    (cardinality / (SELECT COUNT(*) FROM orders)) * 100 AS selectivity
FROM information_schema.STATISTICS
WHERE table_name = 'orders';

6.3 事务与锁问题

-- 查看当前事务
SELECT 
    trx_id,
    trx_state,
    trx_started,
    TIMESTAMPDIFF(SECOND, trx_started, NOW()) as duration_sec,
    trx_mysql_thread_id,
    trx_query
FROM information_schema.INNODB_TRX
ORDER BY duration_sec DESC;

-- 查看未提交的事务(可能导致死锁)
SELECT * FROM information_schema.INNODB_TRX WHERE trx_state = 'RUNNING';

-- 查看死锁信息
SHOW ENGINE INNODB STATUS\G
-- 重点关注 "LATEST DETECTED DEADLOCK" 部分

6.4 数据库连接池调优

HikariCP配置优化:
  minimumIdle: 10
  maximumPoolSize: 20
  connectionTimeout: 30000
  idleTimeout: 600000
  maxLifetime: 1800000
  leakDetectionThreshold: 60000  # 连接泄漏检测(生产环境开启)

  # MySQL驱动优化
  dataSourceProperties:
    cachePrepStmts: true
    prepStmtCacheSize: 250
    prepStmtCacheSqlLimit: 2048
    useServerPrepStmts: true
    rewriteBatchedStatements: true

# 连接泄漏检测日志:
# "Connection leak detection: connection returned to pool after 65 seconds"

来源:
https://detxg.cn/

相关文章
|
8天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
2970 7
|
10天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3071 20
|
23天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23567 15
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
1956 3
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
10天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
2464 3
|
8天前
|
人工智能 安全 开发工具
Claude Code 官方工作原理与使用指南
Claude Code 不是传统代码补全工具,而是 Anthropic 推出的终端 AI 代理,具备代理循环、双驱动架构(模型+工具)、全局项目感知、6 种权限模式等核心能力,本文基于官方文档系统解析其工作原理与高效使用技巧。
1342 0
|
8天前
|
存储 Linux iOS开发
【2026最新】MarkText中文版Markdown编辑器使用图解(附安装包)
MarkText是一款免费开源、跨平台的Markdown编辑器,主打所见即所得实时预览,支持Windows/macOS/Linux。内置数学公式、流程图、代码高亮、多主题及PDF/HTML导出,是Typora的轻量免费替代首选。(239字)