In my Parrot Security workstation, the Intel Chip overheats quite easily, so i prefer to set a lower Max Frequency and turning Turbo Boost. However, if you have tried and tested on your laptop and you want to set the highest frequency your workstation or server Intel chip is capable off, you may glean some insight from the udev rules created here.
Udevadm Info , Udevadm Control or Restart the Laptop
Sometimes we may be clueless as to how to implement udev rules accordingly to type of sysfs devices. In this blog, we will be aiming specifically at the cpu devices.
Running the below command gives you the key parameter you may insert into your udev rules for turning on or off Intel turbo boost techonology:
udevadm info -a -p /sys/devices/system/cpu
The following is an example of what you may see in the terminal:
Udevadm info starts with the device specified by the devpath and thenwalks up the chain of parent devices. It prints for every devicefound, all possible attributes in the udev rules key format.A rule to match, can be composed by the attributes of the deviceand the attributes from one single parent device.
looking at device '/devices/system/cpu':
KERNEL=="cpu"
SUBSYSTEM==""
DRIVER==""
ATTR{isolated}==""
ATTR{kernel_max}=="511"
ATTR{offline}==""
ATTR{online}=="0-3"
ATTR{possible}=="0-3"
ATTR{present}=="0-3"
We then can create a udev prototype to see if it works, which is usually after a full restart of the system. Definitely, we can also run 'udevadm monitor' and 'udevadm control --reload' to initiate the newly created rules. However, a full restart is recommended with SystemD init based GNU/Linux OS.
A prototype for the turbo boost rule is created at path /etc/udev/rules.d/ and the full path is:
/etc/udev/rules.d/83-cpu-boost.rules
Please note the number acting as a prefix for the rule. The higher number prefix means it is executed first by SystemD with a higher priority. The script content of this rule is gleaned from stackoverflow superuser forum at this link (https://superuser.com/questions/648583/howto-set-udev-rule-to-disable-intel-pstate-turbo-on-linux) which is running 2nd Gen Intel Core i processor and above employing intel_pstate. For 1st Gen Core i processor and below (dated before early 2011), which is considered old in mid 2018, the turbo boost technology employed is controlled by cpufreq as seen in this blog. In /etc/udev/rules.d/83-cpu-boost.rules, i inserted the following:
KERNEL=="cpu", ATTR{present}=="0-3", RUN+="/bin/sh -c 'echo -n 0 > /sys/devices/system/cpu/cpufreq/boost'"
It looks simple and should work given that it matches what 'udevadm info' is revealing. Further, we go into reloading the rules using the udevadm as mentioned earlier:
udevadm control --reload
To make sure the udev rules work , you may try to see if there is any output from the reload using
udevadm by running it in monitor mode:
udevadm monitor
To make sure the udev rules work , you may try to see if there is any output from the reload using
udevadm by running it in monitor mode:
udevadm monitor
There is alot of things to learn from udevadm, you may read through manpage of udevadm to gather more insight. Still, it is best to restart the OS to make sure udev rules stick.
Scaling Governor, Max Freq
Using similar method as illustrated above, we can glean from the cpu processor driver the parameters required to make the scaling governor and maximum frequency stick.
Input: udevadm info -a -p /sys/devices/system/cpu/cpuX
NB: X stands for any integer from 0 up to N-1 where N is total number of cpu cores
Output: for intel Nehalem or 1st gen intel cpu0,
looking at device '/devices/system/cpu/cpu0':
KERNEL=="cpu0"
SUBSYSTEM=="cpu"
DRIVER=="processor"
looking at parent device '/devices/system/cpu':
KERNELS=="cpu"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{isolated}==""
ATTRS{kernel_max}=="511"
ATTRS{offline}==""
ATTRS{online}=="0-3"
ATTRS{possible}=="0-3"
ATTRS{present}=="0-3"
If you have noticed, the extended parent device output is the same as the above at path /devices/system/cpu.
Given there are 4 cores in i5 Nehalem processor, i created the rules for scaling governor using for loop at following path:
/etc/udev/rules.d/82-cpu-governor.rules
The parameters and script used is shown following:
KERNEL=="cpu[0-3]",DRIVER=="processor",RUN+="/bin/sh -c 'for i in 0 1 2 3 ; do echo -n conservative > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_governor ; done'"
/etc/udev/rules.d/81-cpu-maxfreq.rules
Before going to set the parameters for max_freq, do double check for scaling_available_frequencies as the following cat command:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
My output shows the following and hence i select the value 1866000 in the script below:
2667000 2666000 2533000 2399000 2266000 2133000 1999000 1866000 1733000 1599000 1466000 1333000 1199000
As the governor is set prior to maxfreq, the number prefix is set in the order as such. The parameters and script for cpu-maxfreq is closely similar to cpu-governor as they share the same sysfs device path. It is shown as follows:
KERNEL=="cpu[0-3]",DRIVER=="processor",RUN+="/bin/sh -c 'for i in 0 1 2 3 ; do echo -n 1866000 > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq ; done'"
That's all for now, hopefully the above gives you insight for you to create your own udev rules to automate part of administering your GNU/Linux system.
No comments:
Post a Comment