Skip to content

[暂不合并]feat(systemd): add THP disable pre-start for DDE services#209

Open
mhduiy wants to merge 1 commit into
linuxdeepin:masterfrom
mhduiy:thp
Open

[暂不合并]feat(systemd): add THP disable pre-start for DDE services#209
mhduiy wants to merge 1 commit into
linuxdeepin:masterfrom
mhduiy:thp

Conversation

@mhduiy
Copy link
Copy Markdown
Contributor

@mhduiy mhduiy commented May 25, 2026

  1. Added ExecStartPre directive to disable Transparent Huge Pages (THP) before DDE core services start
  2. Applied to 5 services: dde-shell desktop plugin, dde-shell DDE, dde-lock, dde-polkit-agent, and dde-session@x11
  3. Uses - prefix on dde-thp-disable to gracefully handle cases where the binary is absent

Log: Disable THP before DDE session services start to reduce memory overhead

feat(systemd): 为 DDE 服务添加 THP 禁用预启动步骤

  1. 在 DDE 核心服务启动前添加 ExecStartPre 指令,用于禁用透明大页(THP)
  2. 覆盖 5 个服务:dde-shell 桌面插件、dde-shell DDE、dde-lock、dde-polkit-agent、dde-session@x11
  3. 对 dde-thp-disable 使用 - 前缀,避免二进制文件缺失时启动失败

Log: 在 DDE 会话服务启动前禁用 THP 以减少内存开销
PMS: TASK-390043

1. Added ExecStartPre directive to disable Transparent Huge Pages (THP) before DDE core services start
2. Applied to 5 services: dde-shell desktop plugin, dde-shell DDE, dde-lock, dde-polkit-agent, and dde-session@x11
3. Uses `-` prefix on dde-thp-disable to gracefully handle cases where the binary is absent

Log: Disable THP before DDE session services start to reduce memory overhead

feat(systemd): 为 DDE 服务添加 THP 禁用预启动步骤

1. 在 DDE 核心服务启动前添加 ExecStartPre 指令,用于禁用透明大页(THP)
2. 覆盖 5 个服务:dde-shell 桌面插件、dde-shell DDE、dde-lock、dde-polkit-agent、dde-session@x11
3. 对 dde-thp-disable 使用 `-` 前缀,避免二进制文件缺失时启动失败

Log: 在 DDE 会话服务启动前禁用 THP 以减少内存开销
PMS: TASK-390043
@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: mhduiy

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @mhduiy, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@mhduiy
Copy link
Copy Markdown
Contributor Author

mhduiy commented May 25, 2026

@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

你好!我是CodeGeeX。我已仔细审查了你提供的 Git Diff 内容。本次修改主要在多个 DDE (Deepin Desktop Environment) 的 systemd 服务单元文件中添加了 ExecStartPre=-/usr/libexec/dde-thp-disable,目的是在核心桌面组件启动前禁用 THP(透明大页)。

以下是我从语法逻辑、代码质量、代码性能和代码安全四个维度提出的详细审查意见和改进建议:

1. 语法逻辑

  • - 前缀的使用(正确):你在 ExecStartPre=-/usr/libexec/... 中使用了 - 前缀,这非常正确。它告诉 systemd 即使该命令执行失败(返回非零退出码),也继续执行后续的 ExecStart。这对于桌面环境来说很重要,避免了因为禁用 THP 失败而导致整个桌面服务无法启动的严重后果。
  • 执行顺序(潜在风险)
    • dde-session@x11.service 中,原文件已经有一个 ExecStartPre(用于复制和修改 kglobalshortcutsrc)。systemd 会按照文件中出现的顺序依次执行 ExecStartPre。当前顺序是先执行 dde-thp-disable,再执行 shell 脚本。从逻辑上看没有问题,但请确认 dde-thp-disable 不会修改环境变量或产生副作用影响到后续的 shell 脚本。

2. 代码质量

  • 代码重复(坏味道):你在 5 个不同的 service 文件中添加了完全相同的 ExecStartPre 指令。这违反了 DRY (Don't Repeat Yourself) 原则。如果未来需要修改这个脚本的路径,或者需要增加其他前置命令,你需要同时修改这 5 个文件,容易遗漏。
    • 改进建议:systemd 支持通过 drop-in 目录(如 .service.d/*.conf)或公共的 target/service 依赖来统一注入配置。如果这些服务都依赖于某个公共的 target(例如 dde-session-core.target),你可以考虑在更上层统一设置,或者编写一个公共的初始化服务,让这些业务服务 After 并且 Requires 那个初始化服务。
  • 缺乏注释说明dde-thp-disable 这个操作对后续维护者来说并不直观。为什么要禁用 THP?通常 THP 是为了提升性能,在桌面核心组件中禁用它必然有特殊原因(例如内核版本的特定 Bug 导致内存碎片或延迟)。
    • 改进建议:在 ExecStartPre 上方添加注释说明原因,例如:# Disable THP to avoid latency spikes on certain kernel versions (Bug: #XXXX)

3. 代码性能

  • 串行执行开销ExecStartPre 是阻塞的,systemd 必须等待它执行完毕才会启动主进程。如果 /usr/libexec/dde-thp-disable 内部包含了耗时的操作(例如等待某个锁、执行复杂的 shell 逻辑),这会拖慢这 5 个桌面核心服务的启动速度,进而影响用户的开机/登录体验。
    • 改进建议:确保 dde-thp-disable 脚本极其轻量,仅仅是向 /sys/kernel/mm/transparent_hugepage/enabled 写入 nevermadvise,并且要处理可能的文件系统挂载只读等异常,做到“快进快出”。
  • 重复执行开销:这 5 个服务在用户登录时几乎会同时拉起,这意味着 /usr/libexec/dde-thp-disable 会被并发执行 5 次。虽然写入 /sys 文件是幂等的,但并发执行同一段 shell 脚本会产生不必要的 fork/exec 开销和 CPU 竞争。
    • 改进建议:如前文所述,将禁用 THP 的逻辑提取到一个独立的、单例的初始化服务中(例如 dde-thp-setup.service),让其他服务仅声明依赖关系,从而保证该逻辑在会话启动期间只执行一次。

4. 代码安全

  • 权限与越权写入(核心风险):修改透明大页状态通常需要 root 权限(写 /sys/kernel/mm/transparent_hugepage/enabled)。而这些 service 文件属于用户会话服务(通常以普通用户身份运行,受 Slice=session.slice 约束)。
    • 如果 dde-thp-disable 内部只是写 /sys 文件,普通用户执行必定会 Permission Denied。虽然你加了 - 忽略了错误,但这意味着该脚本实际上根本没有生效
    • 如果该脚本目前能成功执行,说明系统内部必然配置了 sudoers 规则免密提权,或者使用了具有 SUID 权限的二进制文件,或者使用了 polkit 规则。
    • 改进建议:必须严格审查 dde-thp-disable 的提权方式。如果是通过 sudo 提权,需确保 sudoers 规则严格限制为仅可执行该特定脚本,防止普通用户利用其提权进行越权操作;如果使用 SUID,需确保该二进制文件不存在缓冲区溢出或命令注入漏洞。
  • 脚本路径安全性/usr/libexec/ 通常只能由 root 写入。需确保该目录的权限设置严格(默认应为 755,属主为 root),防止恶意用户替换 dde-thp-disable 脚本,从而在桌面服务启动时获取普通用户甚至 root 用户的权限执行任意代码。

总结与修改示例

总体评价:修改意图明确,systemd 语法使用正确,但存在逻辑冗余、潜在的性能浪费以及需要高度关注的权限安全问题。

改进后的代码示例(以添加注释和优化 x11 服务的顺序为例):

diff --git a/systemd/dde-session-core.target.wants/dde-shell-plugin@org.deepin.ds.desktop.service b/systemd/dde-session-core.target.wants/dde-shell-plugin@org.deepin.ds.desktop.service
index 4452fdb..d10ee93 100644
--- a/systemd/dde-session-core.target.wants/dde-shell-plugin@org.deepin.ds.desktop.service
+++ b/systemd/dde-session-core.target.wants/dde-shell-plugin@org.deepin.ds.desktop.service
@@ -18,6 +18,8 @@ After=dbus.socket
 Type=dbus
 BusName=com.deepin.dde.desktop
 ExecStart=/usr/bin/dde-shell -p %I
+# Disable THP to prevent performance degradation/latency on specific hardware (Ref: Bug #XXXX)
+ExecStartPre=-/usr/libexec/dde-thp-disable
 TimeoutStartSec=infinity
 Slice=session.slice
 Restart=always

diff --git a/systemd/dde-session-pre.target.wants/dde-session@x11.service b/systemd/dde-session-pre.target.wants/dde-session@x11.service
index 5ff802a..77d87b4 100644
--- a/systemd/dde-session-pre.target.wants/dde-session@x11.service
+++ b/systemd/dde-session-pre.target.wants/dde-session@x11.service
@@ -14,7 +14,9 @@ StartLimitBurst=3
 [Service]
 Slice=session.slice
 Type=notify
-ExecStartPre=-/bin/sh -c 'cp -n /etc/xdg/kglobalshortcutsrc "$HOME/.config/kglobalshortcutsrc"; sed -i "s/deepin-kwin/kwin/g" "$HOME/.config/kglobalshortcutsrc"'
+# Disable THP first to ensure consistent memory behavior before GUI starts
+ExecStartPre=-/usr/libexec/dde-thp-disable
+ExecStartPre=-/bin/sh -c 'cp -n /etc/xdg/kglobalshortcutsrc "$HOME/.config/kglobalshortcutsrc"; sed -i "s/deepin-kwin/kwin/g" "$HOME/.config/kglobalshortcutsrc"'
 ExecStart=/usr/bin/kwin_x11 --replace
 # Exit code 1 means we are probably *not* dealing with an extension failure

强烈建议的下一步行动:

  1. 检查 /usr/libexec/dde-thp-disable 的权限和提权机制,确保其在用户会话上下文中确实能生效,且没有安全隐患。
  2. 评估是否可以将此操作提取到一个独立的 dde-session-setup.service 中,让所有需要的服务 After=dde-session-setup.service,以避免 5 次并发执行同一脚本的开销。

@mhduiy mhduiy changed the title feat(systemd): add THP disable pre-start for DDE services [暂不合并]feat(systemd): add THP disable pre-start for DDE services May 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants