JAVA程序绑定到指定的CPU核上

由于服务器上某几个核被C程序绑定了,我们的java程序有的线程会使用到,导致C程序丢包异常,所以需要将JAVA程序绑定到指定的CPU核上

1.命令介绍

1.taskset命令

taskset -c <cpu核编号> <pid> #可以指定进程绑定到哪个cpu核上

2.top命令

我们可以使用top命令来查看,cpu各核的使用情况,进程绑定到哪个cpu核上

top  
输入top后按1,来查看各cpu核使用情况,找个空闲的cpu核

在这里插入图片描述

top -H -p <pid> 
查看进程中各线程cpu使用情况,按f,之后按方向键或者前面的字母键选中Last used cpu(SMP), 按空格键选中,然后按esc返回就可以查看绑定的cpu核

在这里插入图片描述

P列的数字就cpu核的编号

在这里插入图片描述

1.使用

taskset需要指定pid,但是如果进程已经启动了再指定核,之前创建的线程就可能已经飘到了别的cpu核上了,导致不可控,所以我们需要修改程序启动脚本,在启动的时候就指定cpu核

nohup test.sh $1 >> nohup.out 2>&1 & #原来的命令
# 这是我们的启动脚本,叫start.sh,里面调用了test.sh,test.sh里是执行java -jar命令和一些jvm参数之类的启动项,
#所以我们直接将test.sh脚本指定到特定的核上即可
taskset -c 20-24 nohup test.sh $1 >> nohup.out 2>&1 & #修改后的命令

启动成功后 jps -l 查看一下java进程的pid,然后使用top -H -p 查看一个各线程所使用的cpu核为指定的核即可。

2.如果想指定某些线程绑定到固定cpu核上,来提升性能可以使用Java-Thread-Affinity库

https://github.com/OpenHFT/Java-Thread-Affinity

<dependency>
    <groupId>net.openhft</groupId>
    <artifactId>affinity</artifactId>
    <version>3.2.3</version>
</dependency>

具体实现我也没使用过就不写了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows下,可以使用`SetThreadAffinityMask`函数将线程绑定指定CPU核心上。以下是一个示例代码,演示了如何使用C++11标准将线程绑定指定CPU核心上: ```cpp #include <iostream> #include <thread> #include <Windows.h> void bindThreadToCore(std::thread& thread, int core) { // 获取线程的原生句柄 HANDLE nativeThread = thread.native_handle(); // 将线程绑定指定CPU核心 DWORD_PTR affinityMask = (DWORD_PTR)1 << core; DWORD_PTR previousMask = SetThreadAffinityMask(nativeThread, affinityMask); // 检查绑定是否成功 if (previousMask == 0) { std::cerr << "Failed to bind thread to CPU core " << core << std::endl; } else { std::cout << "Thread bound to CPU core " << core << std::endl; } } void myFunction() { // 在这里执行需要绑定在特定CPU核心上的操作 } int main() { int core = 0; // 要绑定CPU核心号 std::thread threadObj(myFunction); bindThreadToCore(threadObj, core); // 等待线程完成 threadObj.join(); return 0; } ``` 在这个示例代码中,我们首先定义了一个名为`bindThreadToCore`的函数,它接受一个`std::thread`对象和一个CPU核心号作为参数。在`bindThreadToCore`函数中,我们首先使用`std::thread::native_handle()`函数获取线程的原生句柄。然后,我们使用`SetThreadAffinityMask`函数将线程绑定指定CPU核心上。 在`main`函数中,我们创建了一个名为`threadObj`的`std::thread`对象,并调用`bindThreadToCore`函数将该线程对象绑定指定CPU核心上。然后,我们等待线程完成,最后输出绑定CPU核心号。 需要注意的是,该方法是Windows特定的,并且依赖于Windows API函数`SetThreadAffinityMask`。请确保在Windows环境下编译和运行该代码。 希望这可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值