Skip to content

Commit

Permalink
Merge #12618: Set SCHED_BATCH priority on the loadblk thread.
Browse files Browse the repository at this point in the history
Summary:
d54874d Set SCHED_BATCH priority on the loadblk thread. (Evan Klitzke)

Pull request description:

  Today I came across #10271, and while reading the discussion #6358 was linked to. Linux systems have a `SCHED_BATCH` scheduler priority that is useful for threads like loadblk. You can find the full details at [sched(7)](http://man7.org/linux/man-pages/man7/sched.7.html), but I'll quote the relevant part of the man page below:

  > ...this policy will cause the scheduler to always assume that the thread is
  CPU-intensive. Consequently, the scheduler will apply a small scheduling penalty
  with respect to wakeup behavior, so that this thread is mildly disfavored in
  scheduling decisions.
  >
  > This policy is useful for workloads that are noninteractive, but do not want to
  lower their nice value, and for workloads that want a deterministic scheduling
  policy without interactivity causing extra preemptions (between the workload's
  tasks).

  I think this change is useful independently of #10271 and irrespective of whether that change is merged. Under normal operation the loadblk thread will just import `mempool.dat`. However, if Bitcoin is started with `-reindex` or `-reindex-chainstate` this thread will use a great deal of CPU while it rebuilds the chainstate database (and the block database in the case of `-reindex`). By setting `SCHED_BATCH` this thread is less likely to interfere with interactive tasks (e.g. the user's web browser, text editor, etc.).

  I'm leaving the nice value unchanged (which also affects scheduling decisions) because I think that's better set by the user. Likewise I'm not using [ioprio_set(2)](http://man7.org/linux/man-pages/man2/ioprio_set.2.html) because it can cause the thread to become completely I/O starved (and knowledgeable users can use `ionice(1)` anyway).

Tree-SHA512: ea8f7d3921ed5708948809da771345cdc33efd7ba3323e9dfec07a25bc21e8612e2676f9c178e2710c7bc437e8c9cafc5e0463613688fea5699b6e8e2fec6cff

Backport of Core PR12618
bitcoin/bitcoin#12618

Test Plan:
  make check
  test_runner.py

Reviewers: deadalnix, Fabien, jasonbcox, O1 Bitcoin ABC, #bitcoin_abc

Reviewed By: deadalnix, O1 Bitcoin ABC, #bitcoin_abc

Differential Revision: https://reviews.bitcoinabc.org/D3953
  • Loading branch information
laanwj authored and jonspock committed Dec 8, 2019
1 parent fc8fc19 commit dae092a
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1150,7 +1150,7 @@ void CleanupBlockRevFiles() {

void ThreadImport(const Config &config, std::vector<fs::path> vImportFiles) {
RenameThread("devault-loadblk");

ScheduleBatchPriority();
{
CImportingNow imp;

Expand Down
18 changes: 18 additions & 0 deletions src/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ using std::ifstream;

#include <algorithm>
#include <fcntl.h>
#include <sched.h>
#include <sys/resource.h>
#include <sys/stat.h>

Expand Down Expand Up @@ -841,3 +842,20 @@ std::string CopyrightHolders(const std::string &strPrefix) {
int64_t GetStartupTime() {
return nStartupTime;
}

fs::path AbsPathForConfigVal(const fs::path &path, bool net_specific) {
return fs::absolute(path, GetDataDir(net_specific));
}

int ScheduleBatchPriority() {
#ifdef SCHED_BATCH
const static sched_param param{0};
if (int ret = pthread_setschedparam(pthread_self(), SCHED_BATCH, &param)) {
LogPrintf("Failed to pthread_setschedparam: %s\n", strerror(errno));
return ret;
}
return 0;
#else
return 1;
#endif
}
9 changes: 9 additions & 0 deletions src/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,4 +328,13 @@ inline void insert(std::set<TsetT> &dst, const Tsrc &src) {

} // namespace util

/**
* 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();

#endif // BITCOIN_UTIL_H

0 comments on commit dae092a

Please sign in to comment.