diff options
author | Evan Klitzke <evan@eklitzke.org> | 2018-03-06 12:50:20 -0500 |
---|---|---|
committer | Evan Klitzke <evan@eklitzke.org> | 2018-03-26 15:59:41 -0700 |
commit | d54874d795a523d7cad5f4a9f4270145e56238f8 (patch) | |
tree | f39d91af0b1506f87c94c75aebf8e901530c70bc | |
parent | 0a018431c447bbf18bdaa6a1037aad6a87c1294a (diff) | |
download | bitcoin-d54874d795a523d7cad5f4a9f4270145e56238f8.tar.xz |
Set SCHED_BATCH priority on the loadblk thread.
While reading another PR I saw a mention of #6358. The use case for
SCHED_BATCH is to hint to the kernel that the thread is running a
non-interactive workload that consumes a lot of CPU time. This is
helpful on desktop machines where the loadblk thread can interfere with
interactive applications. More details can be found in the sched(7) man
page.
-rw-r--r-- | src/init.cpp | 1 | ||||
-rw-r--r-- | src/util.cpp | 15 | ||||
-rw-r--r-- | src/util.h | 9 |
3 files changed, 25 insertions, 0 deletions
diff --git a/src/init.cpp b/src/init.cpp index e5443eef0e..62767edbf8 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -625,6 +625,7 @@ void ThreadImport(std::vector<fs::path> vImportFiles) { const CChainParams& chainparams = Params(); RenameThread("bitcoin-loadblk"); + ScheduleBatchPriority(); { CImportingNow imp; diff --git a/src/util.cpp b/src/util.cpp index 494d5c4eaf..842d4f6e19 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -31,6 +31,7 @@ #include <algorithm> #include <fcntl.h> +#include <sched.h> #include <sys/resource.h> #include <sys/stat.h> @@ -966,3 +967,17 @@ fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific) { return fs::absolute(path, GetDataDir(net_specific)); } + +int ScheduleBatchPriority(void) +{ +#ifdef SCHED_BATCH + const static sched_param param{.sched_priority = 0}; + if (int ret = pthread_setschedparam(0, SCHED_BATCH, ¶m)) { + LogPrintf("Failed to pthread_setschedparam: %s\n", strerror(errno)); + return ret; + } + return 0; +#else + return 1; +#endif +} diff --git a/src/util.h b/src/util.h index 04ff44f218..a9f64a0566 100644 --- a/src/util.h +++ b/src/util.h @@ -357,4 +357,13 @@ std::unique_ptr<T> MakeUnique(Args&&... args) return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } +/** + * On platforms that support it, tell the kernel the calling thread is + * CPU-intensive and non-interactive. See SCHED_BATCH in sched(7) for details. + * + * @return The return value of sched_setschedule(), or 1 on systems without + * sched_setchedule(). + */ +int ScheduleBatchPriority(void); + #endif // BITCOIN_UTIL_H |