java - Java中的高优先级线程

标签 java multithreading scheduling

我目前正在研究分布式应用程序的性能。我的目标是网络组件。目前,每个连接都有一个专用线程以阻塞模式处理套接字。我的目标是减少线程数量(不降低性能),并在可能的情况下提高性能。

我重新设计了网络组件以使用异步通信,并尝试使用 1 到 2 个线程进行整个网络处理。我做了一个简单的测试,我从一个节点在循环中写入并在另一个节点上读取,这是为了测试最大 nw 线程能力,我发现我的繁忙循环实现消耗了 100% cpu,并且每秒执行的操作要多得多要求。因此,我将这个繁忙循环实现集成到现有应用程序中。

我发现的问题是其他线程不允许这些异步 nw 线程获取完整的 cpu,即使我有一个 8 核系统并且我们没有使用超过 400% 的 cpu。基本上,作为一名 C 程序员,我可以通过将我的 nw 线程绑定(bind)到一个核心上并提高其调度优先级来解决这个问题,以便其他线程仍然可以在其他核心上运行。我无法在 Java 中做类似的事情。关于 Java 线程优先级存在相互矛盾的评论。另外,我不想降低其他线程的优先级,因为它可能有其自身的副作用。

你会如何解决这个问题?

最佳答案

我有一个库支持 Linux 和 Windows 上的 Java 线程关联。 https://github.com/peter-lawrey/Java-Thread-Affinity

如果您隔离 CPU,则可以确保您分配的 CPU 不会用于其他任何用途(除了不可屏蔽中断),据我所知,这在 Linux 中效果最好。

<小时/>

如果使用非阻塞 NIO 进行忙等待,则可以获得比阻塞 IO 更低的延迟结果。后者在负载下效果最好,在较低负载下,延迟可能会增加。

您可能会发现这个库很有趣https://github.com/peter-lawrey/Java-Chronicle它允许您每秒保存数百万条消息,可以选择保存到第二个进程。

顺便说一句:线程优先级只是一个提示,操作系统可以随意忽略它(而且经常这样做)

<小时/>

比较热代码与冷代码的简单示例。它所做的只是重复复制一个数组并对其计时。一旦代码和数据变暖,您就不会期望它会变慢,但即使在安静的机器上,也只需要 10 毫秒的延迟即可显着减慢复制所需的时间。

public static void main(String... args) throws InterruptedException {
    int[] from = new int[60000], to = new int[60000];
    for (int i = 0; i < 10; i++)
        copy(from, to); // warm up
    for (int i = 0; i < 10; i++) {
        long start = System.nanoTime();
        copy(from, to);
        long time = System.nanoTime() - start;
        System.out.printf("Warm copy %,d us%n", time / 1000);
    }
    for (int i = 0; i < 10; i++) {
        Thread.sleep(10);
        long start = System.nanoTime();
        copy(from, to);
        long time = System.nanoTime() - start;
        System.out.printf("Cold copy %,d us%n", time / 1000);
    }
}

private static void copy(int[] a, int[] b) {
    for (int i = 0, len = a.length; i < len; i++)
        b[i] = a[i];
}

打印

Warm copy 20 us
Warm copy 20 us
Warm copy 19 us
Warm copy 23 us
Warm copy 20 us
Warm copy 20 us
Cold copy 100 us
Cold copy 80 us
Cold copy 89 us
Cold copy 92 us
Cold copy 80 us
Cold copy 112 us

关于java - Java中的高优先级线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11888767/

相关文章:

c - 为什么这没有在正确的时间中断?

java - Android Instrumented Tests 覆盖范围排除苍蝇

node.js - 如何在nodejs中使用多线程或多进程

java - 游戏期间在后台运行计数器线程

algorithm - 作业车间调度 - 类项目 - 关于引用/算法的建议。用于实现和获得实验结果

c - 使用 sigaction 时未调用信号处理程序

java - JVM 垃圾回收问题

java - 我们可以使用 Spring Boot 对 Nodejs 应用程序进行身份验证吗?

java - 文本相似度搜索算法

java - 在java中制作我自己的事件的正确方法是什么