将一个已经运行的进程attach到固定CPU内核上的方法(linux,windows)

本文介绍如何使用taskset命令在Linux环境下为MySQL等进程指定运行的CPU核心,以实现更高效的资源利用。包括查看和设置进程CPU亲和性的具体操作。

 

       在此前工作中对mysql的调优中曾经使用过该命令,将mysql的实例在制定的若干CPU内核上执行。

 

Retrieve the CPU affinity of an existing task

The general syntax is as follows:
taskset -p [pid]
To retrieve the CPU affinity of an existing task (PID 12345), enter:
# taskset -p 12345

Use taskset command to CPU affinity

The general syntax is as follows:
taskset -c [0,1,2,3..N] [pid]
Where,

  • -c 0,1,2,..N : The masks are typically given in hexadecimal. For example, 0x00000001 is processor #0, 0x00000003 is processors #0 and #1 etc. However -c option allows you to specifiy a numerical list of processors instead of a bitmask. The list may contain multiple items, separated by comma, and ranges. For example, 0,5,7,9-11.
    : Process / program ID
  • pid

For example set PID 12345 on 2-3 CPU, enter:
# taskset -c 2,3 12345

 

参见:http://www.cyberciti.biz/faq/taskset-cpu-affinity-command/

 

windows多核环境可以在任务管理器中图形化设置比较方便,如下图:

如果mysql是允许在windows环境,可以通过这种方法来调优。

 

 

### 使用 eBPF 打印进程相关信息 要在 Linux 内核模块中使用 eBPF 实现打印进程的相关信息,可以借助 BPF 的 kprobes 或 tracepoints 来捕获内核事件并提取所需数据。以下是具体方法: #### 1. 启用 eBPF 支持 在开始之前,需确认当前运行内核已启用 eBPF 功能。可以通过以下命令检查是否存在 `/sys/fs/bpf` 文件夹以及加载 `bpf` 模块: ```bash ls /sys/fs/bpf && lsmod | grep bpf ``` 如果未找到相关内容,则需要按照文档说明,在内核配置文件中启用 eBPF 并重新编译内核[^1]。 #### 2. 编写 eBPF 程序 为了捕获进程信息,可以选择挂载 kprobe 到目标函数上(如 `sched_process_exec`),并通过上下文中获取进程 ID、名称等信息。下面是一个简单的例子,展示如何利用 BCC 工具集来实现这一功能。 ##### 示例代码:使用 BCC 跟踪进程执行 ```python from bcc import BPF # 定义 BPF 程序 program = """ #include <linux/sched.h> #include <uapi/linux/ptrace.h> struct data_t { u32 pid; char comm[TASK_COMM_LEN]; }; BPF_PERF_OUTPUT(events); int do_trace(struct pt_regs *ctx) { struct data_t data = {}; data.pid = bpf_get_current_pid_tgid() >> 32; // 获取 PID bpf_get_current_comm(&data.comm, sizeof(data.comm)); // 获取进程名 events.perf_submit(ctx, &data, sizeof(data)); return 0; } """ # 初始化 BPF 对象 b = BPF(text=program) # 将 kprobe 绑定到 sched_process_exec 函数 b.attach_kprobe(event="sched_process_exec", fn_name="do_trace") # 处理输出的数据 def print_event(cpu, data, size): event = b["events"].event(data) print(f"Process executed: PID={event.pid}, Name={event.comm.decode()}") # 开始监听事件 b["events"].open_perf_buffer(print_event) while True: try: b.perf_buffer_poll() except KeyboardInterrupt: exit() ``` 上述脚本会监控每次调用 `sched_process_exec` 的情况,并记录下对应的进程 ID 和名字[^3]。 #### 3. 验证与调试 完成部署后,可通过实际操作触发相关事件,观察控制台是否有预期的日志输出。如果有异常行为发生,可尝试调整探针位置或者增加更多字段采集更详细的元数据。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值