登录
首页 >  Golang >  Go问答

在Golang代码中如何关闭透明大页面功能?

来源:stackoverflow

时间:2024-02-17 17:45:23 363浏览 收藏

本篇文章向大家介绍《在Golang代码中如何关闭透明大页面功能?》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

有没有办法让我的进程不使用透明大页面,而只是更改整个操作系统(Linux)的配置?


正确答案


您可以按照如下所示进行操作。您应该彻底测试以确保与 go 运行时没有不良交互。

package main

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "runtime"
    "syscall"
)

const (
    // https://filippo.io/linux-syscall-table/
    PRCTL_SYSCALL = 157

    // see /usr/include/linux/prctl.h
    PR_SET_THP_DISABLE = 41
    PR_GET_THP_DISABLE = 42
)

func disableTHP() {
    _, _, errno := syscall.RawSyscall6(uintptr(PRCTL_SYSCALL), uintptr(PR_SET_THP_DISABLE), uintptr(1), 0, 0, 0, 0)
    if errno != 0 {
        log.Fatalf("failed to disable THP: %v", errno)
    }
}
func isTHPDisabled() bool {
    s, _, errno := syscall.RawSyscall6(uintptr(PRCTL_SYSCALL), uintptr(PR_GET_THP_DISABLE), 0, 0, 0, 0, 0)
    if errno != 0 {
        log.Fatalf("failed get THP disable status: %v", errno)
    }
    return s == 1
}

func main() {
    if os.Getenv("X_IN_CHILD_PROC") == "" {
        runtime.LockOSThread()
        disableTHP()
        cmd := exec.Command(os.Args[0], os.Args...)
        cmd.Env = append(os.Environ(), fmt.Sprintf("X_IN_CHILD_PROC=yes"))
        cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
        _ = cmd.Run() // err discarded
        os.Exit(cmd.ProcessState.ExitCode())
    }

    // code below has THP disabled

    if !isTHPDisabled() { // sanity check
        log.Fatal("THP is somehow not disabled")
    }

    fmt.Println("THP is disabled")
    fmt.Println("hello world")
}

到这里,我们也就讲完了《在Golang代码中如何关闭透明大页面功能?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>