This material will walk you through a series of steps to improve your CPU execution time which affects block producing. Note, that EOSIO has included the multi-threading support in 1.5.x release, so it’s not mandatory to isolate CPU cores.
We recommend setting up the ‘chain-threads’ to 8 in nodeos config.ini file:
chain-threads = 8
We aim at getting maximum CPU performance for single threaded nodeos process via CPU Cores Isolation and CPU affinity, and also by disabling c-states, enabling p-states, playing with irqbalancing and other kernel options we can have a decent improvement.
First of all we have to set the Wabt setting in nodeos config.ini file:
wasm-runtime = wabt
or you can try the following if you have the EOSIO version higher or equal to 2.0.x.
wasm-runtime = eos-vm-jit
eos-vm-oc-compile-threads = 4
eos-vm-oc-enable = 1
Next, we have to install all necessary tools.
$ sudo apt install -y schedtool stress linux-tools-`uname -r`
- schedtool - a package which allows querying or altering kernel scheduling policies
- stress - a tool that makes stress tests of computer systems
- linux-tools - utilities package intended for kernel
Add following line to /etc/default/grub and execute the grub-update & reboot command:
GRUB_CMDLINE_LINUX_DEFAULT="cpuidle.off=1 idle=poll isolcpus=1,3,5 processor.ignore_ppc=1 processor.max_cstate=0 intel_idle.max_cstate=0 intel_pstate=enable"
$ sudo update-grub && reboot
After reboot you have to check kernel variables:
$ cat /proc/cmdline
After executing the command above you will find the following:
BOOT_IMAGE=/boot/vmlinuz-4.4.0-22-generic.efi.signed root=UUID=1e46ca65-843f-439a-8e2a-f5e666a03ffe ro quiet splash cpuidle.off=1 idle=poll isolcpus=1,3,5 processor.ignore_ppc=1 processor.max_cstate=0 intel_idle.max_cstate=0 intel_pstate=enable
In case the grub-update is not working, simply add the kernel options shown above to /boot/grub/grub.conf and restart your server.
Now you can check isolated kernels in htop, just start htop in one terminal and cpu stress test in another:
$ stress -c <number of your cpu>
As you can see kernels 1,3 are isolated, and almost idle.
Now we have to link nodeos process to an isolated kernel:
$ taskset -cp 1 `pidof nodeos` && schedtool -B `pidof nodeos`
Now the nodeos process has been successfully scheduled on CPU 01 (Please note, in htop it shows as the cpu number 2)
Here’s the short list of other useful commands that will allow you to check a variety of different details:
# Check c-states
$ cat /sys/module/intel_idle/parameters/max_cstate
# Scaling maximum frequency
for x in /sys/devices/system/cpu/cpu[0-7]/cpufreq/;do
echo 4300000 > $x/scaling_max_freq
done
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
# Set the performance mode for governor
for x in /sys/devices/system/cpu/cpu[0-7]/cpufreq/;do
echo performance > $x/scaling_governor
done
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_gov*
# P-states
for x in /sys/devices/system/cpu/cpu[0-7]/cpufreq/;do
echo intel_pstate > $x/scaling_driver
done
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
# cpupower frequency-info
# cpupower idle-set -d [0-3]
# watch -n 0.4 "grep -E '^cpu MHz' /proc/cpuinfo"
# for i in `pgrep rcu[^c]` ; do taskset -pc 0 $i ; done
#cpumask
echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
#default:1
echo 0 > /proc/sys/kernel/watchdog
#default:0
echo 0 > /proc/sys/kernel/nmi_watchdog
#default:500
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
scala/scala-dev#338
http://linuxrealtime.org/index.php/Improving_the_Real-Time_Properties
http://www.brendangregg.com/perf.html