ZLMediaKit / ZLToolKit

一个基于C++11的轻量级网络框架,基于线程池技术可以实现大并发网络IO
MIT License
1.94k stars 581 forks source link

Thread Priority Setting Issues in ThreadPool.h #186

Closed luohaha66 closed 11 months ago

luohaha66 commented 11 months ago

Thread Priority Setting Issue in ThreadPool.h

Code Related to Setting Thread Pool Priority

    static bool setPriority(Priority priority = PRIORITY_NORMAL, std::thread::native_handle_type threadId = 0) {
        // set priority
#if defined(_WIN32)
        static int Priorities[] = { THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST };
        if (priority != PRIORITY_NORMAL && SetThreadPriority(GetCurrentThread(), Priorities[priority]) == 0) {
            return false;
        }
        return true;
#else
        static int Min = sched_get_priority_min(SCHED_OTHER);
        if (Min == -1) {
            return false;
        }
        static int Max = sched_get_priority_max(SCHED_OTHER);
        if (Max == -1) {
            return false;
        }
        static int Priorities[] = {Min, Min + (Max - Min) / 4, Min + (Max - Min) / 2, Min + (Max - Min) * 3 / 4, Max};

        if (threadId == 0) {
            threadId = pthread_self();
        }
        struct sched_param params;
        params.sched_priority = Priorities[priority];
        return pthread_setschedparam(threadId, SCHED_OTHER, &params) == 0;
#endif
    }

Existing Issues

ThreadPool.h 中线程优先级设置问题

设置线程池优先级相关代码

    static bool setPriority(Priority priority = PRIORITY_NORMAL, std::thread::native_handle_type threadId = 0) {
        // set priority
#if defined(_WIN32)
        static int Priorities[] = { THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST };
        if (priority != PRIORITY_NORMAL && SetThreadPriority(GetCurrentThread(), Priorities[priority]) == 0) {
            return false;
        }
        return true;
#else
        static int Min = sched_get_priority_min(SCHED_OTHER);
        if (Min == -1) {
            return false;
        }
        static int Max = sched_get_priority_max(SCHED_OTHER);
        if (Max == -1) {
            return false;
        }
        static int Priorities[] = {Min, Min + (Max - Min) / 4, Min + (Max - Min) / 2, Min + (Max - Min) * 3 / 4, Max};

        if (threadId == 0) {
            threadId = pthread_self();
        }
        struct sched_param params;
        params.sched_priority = Priorities[priority];
        return pthread_setschedparam(threadId, SCHED_OTHER, &params) == 0;
#endif
    }

存在问题

TRANS_BY_GITHUB_AI_ASSISTANT

xia-chu commented 11 months ago

No, I'm debugging on a Mac, and it should be similar on Linux:

图片

并不是吧 我在mac上调试是这样的,linux应该也类似:

图片

TRANS_BY_GITHUB_AI_ASSISTANT

xia-chu commented 11 months ago

This code is actually copied from other projects.

这个代码其实我也是从其他项目扣得

TRANS_BY_GITHUB_AI_ASSISTANT

luohaha66 commented 11 months ago

man sched Explanation of SCHED_OTHER

Test Code

#include <stdio.h>
#include <sched.h>

int main(void)
{
    int Min = sched_get_priority_min(SCHED_OTHER);
    int Max = sched_get_priority_max(SCHED_OTHER);
    // 输出为 0 0
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_IDLE);
    Max = sched_get_priority_max(SCHED_IDLE);
    // 输出为 0 0
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_BATCH);
    Max = sched_get_priority_max(SCHED_BATCH);
    // 输出为 0 0
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_FIFO);
    Max = sched_get_priority_max(SCHED_FIFO);
    // 输出为 1 99
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_RR);
    Max = sched_get_priority_max(SCHED_RR);
    // 输出为 1 99
    printf("min %d, max %d\n", Min, Max);
    return 0;
}

Test Platform

uname -a Output cpu gcc Version
Linux 5.15.0-86-generic Ubuntu x86_64 GNU/Linux AMD Ryzen 7 3800X 11.3
Linux 5.10.160 SMP aarch64 GNU/Linux RK3588 10.3
Linux 4.19.111 SMP PREEMPT armv7l GNU/Linux RV1126 8.3

Test Results

man sched 对 SCHED_OTHER 的解释

  • SCHED_OTHER: Default Linux time-sharing scheduling SCHED_OTHER can be used at only static priority 0 (i.e., threads under real-time policies always have priority over SCHED_OTHER processes). SCHED_OTHER is the standard Linux time-sharing scheduler that is intended for all threads that do not require the special real-time mechanisms

测试代码

#include <stdio.h>
#include <sched.h>

int main(void)
{
    int Min = sched_get_priority_min(SCHED_OTHER);
    int Max = sched_get_priority_max(SCHED_OTHER);
    // 输出为 0 0
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_IDLE);
    Max = sched_get_priority_max(SCHED_IDLE);
    // 输出为 0 0
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_BATCH);
    Max = sched_get_priority_max(SCHED_BATCH);
    // 输出为 0 0
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_FIFO);
    Max = sched_get_priority_max(SCHED_FIFO);
    // 输出为 1 99
    printf("min %d, max %d\n", Min, Max);

    Min = sched_get_priority_min(SCHED_RR);
    Max = sched_get_priority_max(SCHED_RR);
    // 输出为 1 99
    printf("min %d, max %d\n", Min, Max);
    return 0;
}

测试平台

uname -a 输出 cpu gcc 版本
Linux 5.15.0-86-generic Ubuntu x86_64 GNU/Linux AMD Ryzen 7 3800X 11.3
Linux 5.10.160 SMP aarch64 GNU/Linux RK3588 10.3
Linux 4.19.111 SMP PREEMPT armv7l GNU/Linux RV1126 8.3

测试结果

TRANS_BY_GITHUB_AI_ASSISTANT

xia-chu commented 11 months ago

@luohaha66 What is your suggestion for modification? Should we switch to SCHED_RR or SCHED_FIFO?

@luohaha66 那您的建议是怎么修改?换SCHED_RR还是SCHED_FIFO?

TRANS_BY_GITHUB_AI_ASSISTANT

luohaha66 commented 11 months ago

@luohaha66 那您的建议是怎么修改?换SCHED_RR还是SCHED_FIFO?

I will reply to you during work hours tomorrow.

@luohaha66 那您的建议是怎么修改?换SCHED_RR还是SCHED_FIFO?

我明天工作时间回复您。

TRANS_BY_GITHUB_AI_ASSISTANT

luohaha66 commented 11 months ago

How to Choose Between SCHED_RR and SCHED_FIFO

SCHED_FIFO

SCHED_RR

Analysis

SCHED_FIFO Use Cases

SCHED_RR Use Cases

Recommendation

SCHED_RR SCHED_FIFO 如何选择

SCHED_FIFO

SCHED_RR

分析

SCHED_FIFO 适用情况

SCHED_RR 适用情况

建议

TRANS_BY_GITHUB_AI_ASSISTANT

xia-chu commented 11 months ago

Good! Let's modify it like this:

Index: src/Thread/ThreadPool.h
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/Thread/ThreadPool.h b/src/Thread/ThreadPool.h
--- a/src/Thread/ThreadPool.h   (revision 3fd2b856b6856dd679a32c673431561c0affdd0c)
+++ b/src/Thread/ThreadPool.h   (date 1698292460548)
@@ -86,11 +86,11 @@
         }
         return true;
 #else
-        static int Min = sched_get_priority_min(SCHED_OTHER);
+        static int Min = sched_get_priority_min(SCHED_FIFO);
         if (Min == -1) {
             return false;
         }
-        static int Max = sched_get_priority_max(SCHED_OTHER);
+        static int Max = sched_get_priority_max(SCHED_FIFO);
         if (Max == -1) {
             return false;
         }
@@ -101,7 +101,7 @@
         }
         struct sched_param params;
         params.sched_priority = Priorities[priority];
-        return pthread_setschedparam(threadId, SCHED_OTHER, &params) == 0;
+        return pthread_setschedparam(threadId, SCHED_FIFO, &params) == 0;
 #endif
     }

善哉!那这样修改吧:


Index: src/Thread/ThreadPool.h
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/Thread/ThreadPool.h b/src/Thread/ThreadPool.h
--- a/src/Thread/ThreadPool.h   (revision 3fd2b856b6856dd679a32c673431561c0affdd0c)
+++ b/src/Thread/ThreadPool.h   (date 1698292460548)
@@ -86,11 +86,11 @@
}
return true;
#else
-        static int Min = sched_get_priority_min(SCHED_OTHER);
+        static int Min = sched_get_priority_min(SCHED_FIFO);
if (Min == -1) {
return false;
}
-        static int Max = sched_get_priority_max(SCHED_OTHER);
+        static int Max = sched_get_priority_max(SCHED_FIFO);
if (Max == -1) {
return false;
}
@@ -101,7 +101,7 @@
}
struct sched_param params;
params.sched_priority = Priorities[priority];
-        return pthread_setschedparam(threadId, SCHED_OTHER, &params) == 0;
+        return pthread_setschedparam(threadId, SCHED_FIFO, &params) == 0;
#endif
}


`TRANS_BY_GITHUB_AI_ASSISTANT`
luohaha66 commented 11 months ago

Thank you, the above modifications are sufficient.

谢谢,按照上述修改即可。

TRANS_BY_GITHUB_AI_ASSISTANT

xia-chu commented 11 months ago

Submitted. Thanks!

已提交 感谢!

TRANS_BY_GITHUB_AI_ASSISTANT