1*4882a593Smuzhiyun========================================== 2*4882a593SmuzhiyunReducing OS jitter due to per-cpu kthreads 3*4882a593Smuzhiyun========================================== 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunThis document lists per-CPU kthreads in the Linux kernel and presents 6*4882a593Smuzhiyunoptions to control their OS jitter. Note that non-per-CPU kthreads are 7*4882a593Smuzhiyunnot listed here. To reduce OS jitter from non-per-CPU kthreads, bind 8*4882a593Smuzhiyunthem to a "housekeeping" CPU dedicated to such work. 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunReferences 11*4882a593Smuzhiyun========== 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun- Documentation/core-api/irq/irq-affinity.rst: Binding interrupts to sets of CPUs. 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun- Documentation/admin-guide/cgroup-v1: Using cgroups to bind tasks to sets of CPUs. 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun- man taskset: Using the taskset command to bind tasks to sets 18*4882a593Smuzhiyun of CPUs. 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun- man sched_setaffinity: Using the sched_setaffinity() system 21*4882a593Smuzhiyun call to bind tasks to sets of CPUs. 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun- /sys/devices/system/cpu/cpuN/online: Control CPU N's hotplug state, 24*4882a593Smuzhiyun writing "0" to offline and "1" to online. 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun- In order to locate kernel-generated OS jitter on CPU N: 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun cd /sys/kernel/debug/tracing 29*4882a593Smuzhiyun echo 1 > max_graph_depth # Increase the "1" for more detail 30*4882a593Smuzhiyun echo function_graph > current_tracer 31*4882a593Smuzhiyun # run workload 32*4882a593Smuzhiyun cat per_cpu/cpuN/trace 33*4882a593Smuzhiyun 34*4882a593Smuzhiyunkthreads 35*4882a593Smuzhiyun======== 36*4882a593Smuzhiyun 37*4882a593SmuzhiyunName: 38*4882a593Smuzhiyun ehca_comp/%u 39*4882a593Smuzhiyun 40*4882a593SmuzhiyunPurpose: 41*4882a593Smuzhiyun Periodically process Infiniband-related work. 42*4882a593Smuzhiyun 43*4882a593SmuzhiyunTo reduce its OS jitter, do any of the following: 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun1. Don't use eHCA Infiniband hardware, instead choosing hardware 46*4882a593Smuzhiyun that does not require per-CPU kthreads. This will prevent these 47*4882a593Smuzhiyun kthreads from being created in the first place. (This will 48*4882a593Smuzhiyun work for most people, as this hardware, though important, is 49*4882a593Smuzhiyun relatively old and is produced in relatively low unit volumes.) 50*4882a593Smuzhiyun2. Do all eHCA-Infiniband-related work on other CPUs, including 51*4882a593Smuzhiyun interrupts. 52*4882a593Smuzhiyun3. Rework the eHCA driver so that its per-CPU kthreads are 53*4882a593Smuzhiyun provisioned only on selected CPUs. 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun 56*4882a593SmuzhiyunName: 57*4882a593Smuzhiyun irq/%d-%s 58*4882a593Smuzhiyun 59*4882a593SmuzhiyunPurpose: 60*4882a593Smuzhiyun Handle threaded interrupts. 61*4882a593Smuzhiyun 62*4882a593SmuzhiyunTo reduce its OS jitter, do the following: 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun1. Use irq affinity to force the irq threads to execute on 65*4882a593Smuzhiyun some other CPU. 66*4882a593Smuzhiyun 67*4882a593SmuzhiyunName: 68*4882a593Smuzhiyun kcmtpd_ctr_%d 69*4882a593Smuzhiyun 70*4882a593SmuzhiyunPurpose: 71*4882a593Smuzhiyun Handle Bluetooth work. 72*4882a593Smuzhiyun 73*4882a593SmuzhiyunTo reduce its OS jitter, do one of the following: 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun1. Don't use Bluetooth, in which case these kthreads won't be 76*4882a593Smuzhiyun created in the first place. 77*4882a593Smuzhiyun2. Use irq affinity to force Bluetooth-related interrupts to 78*4882a593Smuzhiyun occur on some other CPU and furthermore initiate all 79*4882a593Smuzhiyun Bluetooth activity on some other CPU. 80*4882a593Smuzhiyun 81*4882a593SmuzhiyunName: 82*4882a593Smuzhiyun ksoftirqd/%u 83*4882a593Smuzhiyun 84*4882a593SmuzhiyunPurpose: 85*4882a593Smuzhiyun Execute softirq handlers when threaded or when under heavy load. 86*4882a593Smuzhiyun 87*4882a593SmuzhiyunTo reduce its OS jitter, each softirq vector must be handled 88*4882a593Smuzhiyunseparately as follows: 89*4882a593Smuzhiyun 90*4882a593SmuzhiyunTIMER_SOFTIRQ 91*4882a593Smuzhiyun------------- 92*4882a593Smuzhiyun 93*4882a593SmuzhiyunDo all of the following: 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun1. To the extent possible, keep the CPU out of the kernel when it 96*4882a593Smuzhiyun is non-idle, for example, by avoiding system calls and by forcing 97*4882a593Smuzhiyun both kernel threads and interrupts to execute elsewhere. 98*4882a593Smuzhiyun2. Build with CONFIG_HOTPLUG_CPU=y. After boot completes, force 99*4882a593Smuzhiyun the CPU offline, then bring it back online. This forces 100*4882a593Smuzhiyun recurring timers to migrate elsewhere. If you are concerned 101*4882a593Smuzhiyun with multiple CPUs, force them all offline before bringing the 102*4882a593Smuzhiyun first one back online. Once you have onlined the CPUs in question, 103*4882a593Smuzhiyun do not offline any other CPUs, because doing so could force the 104*4882a593Smuzhiyun timer back onto one of the CPUs in question. 105*4882a593Smuzhiyun 106*4882a593SmuzhiyunNET_TX_SOFTIRQ and NET_RX_SOFTIRQ 107*4882a593Smuzhiyun--------------------------------- 108*4882a593Smuzhiyun 109*4882a593SmuzhiyunDo all of the following: 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun1. Force networking interrupts onto other CPUs. 112*4882a593Smuzhiyun2. Initiate any network I/O on other CPUs. 113*4882a593Smuzhiyun3. Once your application has started, prevent CPU-hotplug operations 114*4882a593Smuzhiyun from being initiated from tasks that might run on the CPU to 115*4882a593Smuzhiyun be de-jittered. (It is OK to force this CPU offline and then 116*4882a593Smuzhiyun bring it back online before you start your application.) 117*4882a593Smuzhiyun 118*4882a593SmuzhiyunBLOCK_SOFTIRQ 119*4882a593Smuzhiyun------------- 120*4882a593Smuzhiyun 121*4882a593SmuzhiyunDo all of the following: 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun1. Force block-device interrupts onto some other CPU. 124*4882a593Smuzhiyun2. Initiate any block I/O on other CPUs. 125*4882a593Smuzhiyun3. Once your application has started, prevent CPU-hotplug operations 126*4882a593Smuzhiyun from being initiated from tasks that might run on the CPU to 127*4882a593Smuzhiyun be de-jittered. (It is OK to force this CPU offline and then 128*4882a593Smuzhiyun bring it back online before you start your application.) 129*4882a593Smuzhiyun 130*4882a593SmuzhiyunIRQ_POLL_SOFTIRQ 131*4882a593Smuzhiyun---------------- 132*4882a593Smuzhiyun 133*4882a593SmuzhiyunDo all of the following: 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun1. Force block-device interrupts onto some other CPU. 136*4882a593Smuzhiyun2. Initiate any block I/O and block-I/O polling on other CPUs. 137*4882a593Smuzhiyun3. Once your application has started, prevent CPU-hotplug operations 138*4882a593Smuzhiyun from being initiated from tasks that might run on the CPU to 139*4882a593Smuzhiyun be de-jittered. (It is OK to force this CPU offline and then 140*4882a593Smuzhiyun bring it back online before you start your application.) 141*4882a593Smuzhiyun 142*4882a593SmuzhiyunTASKLET_SOFTIRQ 143*4882a593Smuzhiyun--------------- 144*4882a593Smuzhiyun 145*4882a593SmuzhiyunDo one or more of the following: 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun1. Avoid use of drivers that use tasklets. (Such drivers will contain 148*4882a593Smuzhiyun calls to things like tasklet_schedule().) 149*4882a593Smuzhiyun2. Convert all drivers that you must use from tasklets to workqueues. 150*4882a593Smuzhiyun3. Force interrupts for drivers using tasklets onto other CPUs, 151*4882a593Smuzhiyun and also do I/O involving these drivers on other CPUs. 152*4882a593Smuzhiyun 153*4882a593SmuzhiyunSCHED_SOFTIRQ 154*4882a593Smuzhiyun------------- 155*4882a593Smuzhiyun 156*4882a593SmuzhiyunDo all of the following: 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun1. Avoid sending scheduler IPIs to the CPU to be de-jittered, 159*4882a593Smuzhiyun for example, ensure that at most one runnable kthread is present 160*4882a593Smuzhiyun on that CPU. If a thread that expects to run on the de-jittered 161*4882a593Smuzhiyun CPU awakens, the scheduler will send an IPI that can result in 162*4882a593Smuzhiyun a subsequent SCHED_SOFTIRQ. 163*4882a593Smuzhiyun2. CONFIG_NO_HZ_FULL=y and ensure that the CPU to be de-jittered 164*4882a593Smuzhiyun is marked as an adaptive-ticks CPU using the "nohz_full=" 165*4882a593Smuzhiyun boot parameter. This reduces the number of scheduler-clock 166*4882a593Smuzhiyun interrupts that the de-jittered CPU receives, minimizing its 167*4882a593Smuzhiyun chances of being selected to do the load balancing work that 168*4882a593Smuzhiyun runs in SCHED_SOFTIRQ context. 169*4882a593Smuzhiyun3. To the extent possible, keep the CPU out of the kernel when it 170*4882a593Smuzhiyun is non-idle, for example, by avoiding system calls and by 171*4882a593Smuzhiyun forcing both kernel threads and interrupts to execute elsewhere. 172*4882a593Smuzhiyun This further reduces the number of scheduler-clock interrupts 173*4882a593Smuzhiyun received by the de-jittered CPU. 174*4882a593Smuzhiyun 175*4882a593SmuzhiyunHRTIMER_SOFTIRQ 176*4882a593Smuzhiyun--------------- 177*4882a593Smuzhiyun 178*4882a593SmuzhiyunDo all of the following: 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun1. To the extent possible, keep the CPU out of the kernel when it 181*4882a593Smuzhiyun is non-idle. For example, avoid system calls and force both 182*4882a593Smuzhiyun kernel threads and interrupts to execute elsewhere. 183*4882a593Smuzhiyun2. Build with CONFIG_HOTPLUG_CPU=y. Once boot completes, force the 184*4882a593Smuzhiyun CPU offline, then bring it back online. This forces recurring 185*4882a593Smuzhiyun timers to migrate elsewhere. If you are concerned with multiple 186*4882a593Smuzhiyun CPUs, force them all offline before bringing the first one 187*4882a593Smuzhiyun back online. Once you have onlined the CPUs in question, do not 188*4882a593Smuzhiyun offline any other CPUs, because doing so could force the timer 189*4882a593Smuzhiyun back onto one of the CPUs in question. 190*4882a593Smuzhiyun 191*4882a593SmuzhiyunRCU_SOFTIRQ 192*4882a593Smuzhiyun----------- 193*4882a593Smuzhiyun 194*4882a593SmuzhiyunDo at least one of the following: 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun1. Offload callbacks and keep the CPU in either dyntick-idle or 197*4882a593Smuzhiyun adaptive-ticks state by doing all of the following: 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun a. CONFIG_NO_HZ_FULL=y and ensure that the CPU to be 200*4882a593Smuzhiyun de-jittered is marked as an adaptive-ticks CPU using the 201*4882a593Smuzhiyun "nohz_full=" boot parameter. Bind the rcuo kthreads to 202*4882a593Smuzhiyun housekeeping CPUs, which can tolerate OS jitter. 203*4882a593Smuzhiyun b. To the extent possible, keep the CPU out of the kernel 204*4882a593Smuzhiyun when it is non-idle, for example, by avoiding system 205*4882a593Smuzhiyun calls and by forcing both kernel threads and interrupts 206*4882a593Smuzhiyun to execute elsewhere. 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun2. Enable RCU to do its processing remotely via dyntick-idle by 209*4882a593Smuzhiyun doing all of the following: 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun a. Build with CONFIG_NO_HZ=y and CONFIG_RCU_FAST_NO_HZ=y. 212*4882a593Smuzhiyun b. Ensure that the CPU goes idle frequently, allowing other 213*4882a593Smuzhiyun CPUs to detect that it has passed through an RCU quiescent 214*4882a593Smuzhiyun state. If the kernel is built with CONFIG_NO_HZ_FULL=y, 215*4882a593Smuzhiyun userspace execution also allows other CPUs to detect that 216*4882a593Smuzhiyun the CPU in question has passed through a quiescent state. 217*4882a593Smuzhiyun c. To the extent possible, keep the CPU out of the kernel 218*4882a593Smuzhiyun when it is non-idle, for example, by avoiding system 219*4882a593Smuzhiyun calls and by forcing both kernel threads and interrupts 220*4882a593Smuzhiyun to execute elsewhere. 221*4882a593Smuzhiyun 222*4882a593SmuzhiyunName: 223*4882a593Smuzhiyun kworker/%u:%d%s (cpu, id, priority) 224*4882a593Smuzhiyun 225*4882a593SmuzhiyunPurpose: 226*4882a593Smuzhiyun Execute workqueue requests 227*4882a593Smuzhiyun 228*4882a593SmuzhiyunTo reduce its OS jitter, do any of the following: 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun1. Run your workload at a real-time priority, which will allow 231*4882a593Smuzhiyun preempting the kworker daemons. 232*4882a593Smuzhiyun2. A given workqueue can be made visible in the sysfs filesystem 233*4882a593Smuzhiyun by passing the WQ_SYSFS to that workqueue's alloc_workqueue(). 234*4882a593Smuzhiyun Such a workqueue can be confined to a given subset of the 235*4882a593Smuzhiyun CPUs using the ``/sys/devices/virtual/workqueue/*/cpumask`` sysfs 236*4882a593Smuzhiyun files. The set of WQ_SYSFS workqueues can be displayed using 237*4882a593Smuzhiyun "ls /sys/devices/virtual/workqueue". That said, the workqueues 238*4882a593Smuzhiyun maintainer would like to caution people against indiscriminately 239*4882a593Smuzhiyun sprinkling WQ_SYSFS across all the workqueues. The reason for 240*4882a593Smuzhiyun caution is that it is easy to add WQ_SYSFS, but because sysfs is 241*4882a593Smuzhiyun part of the formal user/kernel API, it can be nearly impossible 242*4882a593Smuzhiyun to remove it, even if its addition was a mistake. 243*4882a593Smuzhiyun3. Do any of the following needed to avoid jitter that your 244*4882a593Smuzhiyun application cannot tolerate: 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun a. Build your kernel with CONFIG_SLUB=y rather than 247*4882a593Smuzhiyun CONFIG_SLAB=y, thus avoiding the slab allocator's periodic 248*4882a593Smuzhiyun use of each CPU's workqueues to run its cache_reap() 249*4882a593Smuzhiyun function. 250*4882a593Smuzhiyun b. Avoid using oprofile, thus avoiding OS jitter from 251*4882a593Smuzhiyun wq_sync_buffer(). 252*4882a593Smuzhiyun c. Limit your CPU frequency so that a CPU-frequency 253*4882a593Smuzhiyun governor is not required, possibly enlisting the aid of 254*4882a593Smuzhiyun special heatsinks or other cooling technologies. If done 255*4882a593Smuzhiyun correctly, and if you CPU architecture permits, you should 256*4882a593Smuzhiyun be able to build your kernel with CONFIG_CPU_FREQ=n to 257*4882a593Smuzhiyun avoid the CPU-frequency governor periodically running 258*4882a593Smuzhiyun on each CPU, including cs_dbs_timer() and od_dbs_timer(). 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun WARNING: Please check your CPU specifications to 261*4882a593Smuzhiyun make sure that this is safe on your particular system. 262*4882a593Smuzhiyun d. As of v3.18, Christoph Lameter's on-demand vmstat workers 263*4882a593Smuzhiyun commit prevents OS jitter due to vmstat_update() on 264*4882a593Smuzhiyun CONFIG_SMP=y systems. Before v3.18, is not possible 265*4882a593Smuzhiyun to entirely get rid of the OS jitter, but you can 266*4882a593Smuzhiyun decrease its frequency by writing a large value to 267*4882a593Smuzhiyun /proc/sys/vm/stat_interval. The default value is HZ, 268*4882a593Smuzhiyun for an interval of one second. Of course, larger values 269*4882a593Smuzhiyun will make your virtual-memory statistics update more 270*4882a593Smuzhiyun slowly. Of course, you can also run your workload at 271*4882a593Smuzhiyun a real-time priority, thus preempting vmstat_update(), 272*4882a593Smuzhiyun but if your workload is CPU-bound, this is a bad idea. 273*4882a593Smuzhiyun However, there is an RFC patch from Christoph Lameter 274*4882a593Smuzhiyun (based on an earlier one from Gilad Ben-Yossef) that 275*4882a593Smuzhiyun reduces or even eliminates vmstat overhead for some 276*4882a593Smuzhiyun workloads at https://lkml.org/lkml/2013/9/4/379. 277*4882a593Smuzhiyun e. If running on high-end powerpc servers, build with 278*4882a593Smuzhiyun CONFIG_PPC_RTAS_DAEMON=n. This prevents the RTAS 279*4882a593Smuzhiyun daemon from running on each CPU every second or so. 280*4882a593Smuzhiyun (This will require editing Kconfig files and will defeat 281*4882a593Smuzhiyun this platform's RAS functionality.) This avoids jitter 282*4882a593Smuzhiyun due to the rtas_event_scan() function. 283*4882a593Smuzhiyun WARNING: Please check your CPU specifications to 284*4882a593Smuzhiyun make sure that this is safe on your particular system. 285*4882a593Smuzhiyun f. If running on Cell Processor, build your kernel with 286*4882a593Smuzhiyun CBE_CPUFREQ_SPU_GOVERNOR=n to avoid OS jitter from 287*4882a593Smuzhiyun spu_gov_work(). 288*4882a593Smuzhiyun WARNING: Please check your CPU specifications to 289*4882a593Smuzhiyun make sure that this is safe on your particular system. 290*4882a593Smuzhiyun g. If running on PowerMAC, build your kernel with 291*4882a593Smuzhiyun CONFIG_PMAC_RACKMETER=n to disable the CPU-meter, 292*4882a593Smuzhiyun avoiding OS jitter from rackmeter_do_timer(). 293*4882a593Smuzhiyun 294*4882a593SmuzhiyunName: 295*4882a593Smuzhiyun rcuc/%u 296*4882a593Smuzhiyun 297*4882a593SmuzhiyunPurpose: 298*4882a593Smuzhiyun Execute RCU callbacks in CONFIG_RCU_BOOST=y kernels. 299*4882a593Smuzhiyun 300*4882a593SmuzhiyunTo reduce its OS jitter, do at least one of the following: 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun1. Build the kernel with CONFIG_PREEMPT=n. This prevents these 303*4882a593Smuzhiyun kthreads from being created in the first place, and also obviates 304*4882a593Smuzhiyun the need for RCU priority boosting. This approach is feasible 305*4882a593Smuzhiyun for workloads that do not require high degrees of responsiveness. 306*4882a593Smuzhiyun2. Build the kernel with CONFIG_RCU_BOOST=n. This prevents these 307*4882a593Smuzhiyun kthreads from being created in the first place. This approach 308*4882a593Smuzhiyun is feasible only if your workload never requires RCU priority 309*4882a593Smuzhiyun boosting, for example, if you ensure frequent idle time on all 310*4882a593Smuzhiyun CPUs that might execute within the kernel. 311*4882a593Smuzhiyun3. Build with CONFIG_RCU_NOCB_CPU=y and boot with the rcu_nocbs= 312*4882a593Smuzhiyun boot parameter offloading RCU callbacks from all CPUs susceptible 313*4882a593Smuzhiyun to OS jitter. This approach prevents the rcuc/%u kthreads from 314*4882a593Smuzhiyun having any work to do, so that they are never awakened. 315*4882a593Smuzhiyun4. Ensure that the CPU never enters the kernel, and, in particular, 316*4882a593Smuzhiyun avoid initiating any CPU hotplug operations on this CPU. This is 317*4882a593Smuzhiyun another way of preventing any callbacks from being queued on the 318*4882a593Smuzhiyun CPU, again preventing the rcuc/%u kthreads from having any work 319*4882a593Smuzhiyun to do. 320*4882a593Smuzhiyun 321*4882a593SmuzhiyunName: 322*4882a593Smuzhiyun rcuop/%d and rcuos/%d 323*4882a593Smuzhiyun 324*4882a593SmuzhiyunPurpose: 325*4882a593Smuzhiyun Offload RCU callbacks from the corresponding CPU. 326*4882a593Smuzhiyun 327*4882a593SmuzhiyunTo reduce its OS jitter, do at least one of the following: 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun1. Use affinity, cgroups, or other mechanism to force these kthreads 330*4882a593Smuzhiyun to execute on some other CPU. 331*4882a593Smuzhiyun2. Build with CONFIG_RCU_NOCB_CPU=n, which will prevent these 332*4882a593Smuzhiyun kthreads from being created in the first place. However, please 333*4882a593Smuzhiyun note that this will not eliminate OS jitter, but will instead 334*4882a593Smuzhiyun shift it to RCU_SOFTIRQ. 335*4882a593Smuzhiyun 336*4882a593SmuzhiyunName: 337*4882a593Smuzhiyun watchdog/%u 338*4882a593Smuzhiyun 339*4882a593SmuzhiyunPurpose: 340*4882a593Smuzhiyun Detect software lockups on each CPU. 341*4882a593Smuzhiyun 342*4882a593SmuzhiyunTo reduce its OS jitter, do at least one of the following: 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun1. Build with CONFIG_LOCKUP_DETECTOR=n, which will prevent these 345*4882a593Smuzhiyun kthreads from being created in the first place. 346*4882a593Smuzhiyun2. Boot with "nosoftlockup=0", which will also prevent these kthreads 347*4882a593Smuzhiyun from being created. Other related watchdog and softlockup boot 348*4882a593Smuzhiyun parameters may be found in Documentation/admin-guide/kernel-parameters.rst 349*4882a593Smuzhiyun and Documentation/watchdog/watchdog-parameters.rst. 350*4882a593Smuzhiyun3. Echo a zero to /proc/sys/kernel/watchdog to disable the 351*4882a593Smuzhiyun watchdog timer. 352*4882a593Smuzhiyun4. Echo a large number of /proc/sys/kernel/watchdog_thresh in 353*4882a593Smuzhiyun order to reduce the frequency of OS jitter due to the watchdog 354*4882a593Smuzhiyun timer down to a level that is acceptable for your workload. 355