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), 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) because it can cause the thread to become completely I/O starved (and knowledgeable users can use ionice(1)
anyway).