已开启
Percona Server 5.7.44-53 进行 CFGO 优化时,PGO 插桩二进制执行 SELECT 1 时通过 TCP 卡住 #92
liangwenjiao创建于  8月12日
liangwenjiao
liangwenjiao
8月12日 创建

问题概述

使用 openEuler GCC 12.3.1 2025.06 的 CFGO PGO 流程构建 Percona Server 5.7.44-53后,03-build-cfgo-pgo 阶段生成的 PGO 插桩(profile-generate)二进制在执行最小 SQL 请求时会卡住:

mysql --protocol=TCP -e 'SELECT 1'

客户端无法收到结果并一直等待,服务端进程仍然存在。该现象出现在用于采集 profile 的 mysqld.cfgo-pgo,不是后续 05-build-cfgo-cspgo 生成的 profile-use 二进制,也不是最终 BOLT 优化二进制。

现象:

使用 mysqld.cfgo-pgo 启动服务后,sysbench 工作负载可以运行;但单独执行 SELECT 1 会卡住。问题不表现为服务启动失败,而是特定 SQL 请求的执行/响应路径异常。

环境

操作系统和架构

AArch64
openEuler

编译器

gcc-12.3.1-2025.06-aarch64-linux

CFGO 相关源码提交:

84635dc65ebe285457d0c16bbb5caf995f803436
[CFGO] Add cfgo-pgo optimization

9f8d7de855feb149e2ea58b72167b22908afacdc
[CFGO] Add more opts to cfgo

65b4c05ba79d7dc10ac9ed963ad17fd32c9f2fce
[CFGO] Update opts for CFGO-PGO

数据库版本

Percona Server 5.7.44-53

涉及的二进制和阶段

阶段 二进制类型 相关参数 结果
01/02 原生构建二进制 普通 GCC 参数 SELECT 1 正常
03-build-cfgo-pgo PGO 插桩/采样二进制 mysqld.cfgo-pgo -fcfgo-profile-generate=<profile-dir> SELECT 1 卡住

复现条件

在正常 MySQL 构建参数基础上,对 PGO generate 阶段注入:

-fcfgo-profile-generate=<profile-dir>

启动 03-build-cfgo-pgo 生成的 mysqld.cfgo-pgo,然后通过 TCP 执行:

mysql --protocol=TCP -e 'SELECT 1'

实际结果是命令不返回、持续等待。建议使用超时包装以便自动化复现:

timeout 30s mysql --protocol=TCP -e 'SELECT 1'

预期应在超时前输出:

1

结果对比

测试对象 sysbench mysql --protocol=TCP -e 'SELECT 1'
原生构建二进制 PASS PASS
CFGO PGO generate 二进制 mysqld.cfgo-pgo PASS FAIL,客户端卡住

该问题可以被最小化到单条非 prepared statement 查询,不需要先执行复杂业务 workload。当前记录中尚未观察到对应的 SQL 错误码或崩溃信号,主要表现为服务端没有完成该请求的协议响应,客户端一直等待。

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月12日 添加了label:sig/Compiler
openeuler-ci-bot
openeuler-ci-bot成员
8月12日 评论:

Welcome To openEuler Community

Hey @always_flipped_1 , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: Compiler ,
and any of the maintainers: @SegFault, @alexanderbill, @cf-zhao, @chenzheng1030, @eastb233, @kuenking111_admin, @li-yancheng, @wangqiang95, @wd-gitcode ,
and any of the committers: @huang-xiaoquan, @huzife, @lin-4682, @xiongzhou4 .

likedislike
liangwenjiaoliangwenjiao
8月12日 修改标题为 “Percona Server 5.7.44-53进行CFGO优化时,PGO 插桩二进制执行 SELECT 1 时通过 TCP 卡住”,原标题为“Percona Server 5.7.44-53进行CFGO优化时,PGO 插桩二进制执行 `SELECT 1` 时通过 TCP 卡住”
liangwenjiaoliangwenjiao
8月12日 修改标题为 “Percona Server 5.7.44-53 进行 CFGO 优化时,PGO 插桩二进制执行 SELECT 1 时通过 TCP 卡住”,原标题为“Percona Server 5.7.44-53进行CFGO优化时,PGO 插桩二进制执行 SELECT 1 时通过 TCP 卡住”
rfwang07
rfwang07
8月19日 评论:
  1. 已从CFGO中移除-fselective-scheduling https://gitcode.com/openeuler/gcc/pull/386
  2. 问题根因为send_eof() 这个虚调用的"投机去虚化守卫"被编译器改成了恒真(-fselective-scheduling错误优化),最终导致服务端执行的是一个空实现,结果集的终结 EOF 包永远没发出去,客户端一直等在读行的循环里。该问题是上游版本缺陷,待提交上游修复
likedislike