Tinh chỉnh xung nhịp và số nhân ARM chạy trong Linux, bài viết sẽ được update từ từ
LuxiTD
một tháng trướcBình luận: 3Lượt xem: 1.133
Sau một thời gian lăn lộn với ARM chạy Linux thì mình rút một số kinh nghiệm xương máu sau đây:

1. Bo mạch ARM tích hợp rất nhiều thành phần I/O như: bluetooth, NFC, vân tay, wifi, cpu, màn hình cảm ứng, gpu, iio-sensor v.v.. Nên việc khởi chạy mà không có quạt tản nhiệt thì rất dễ treo máy, đặc biệt trên điện thoại và máy tính bảng

2. Nói Linux bào phần cứng dễ hư là đúng một nửa, vì nếu thiết lập đúng thì máy chạy ngon, nhiệt độ toả ra không gây hại nhiều cho thiết bị và linh kiện. Nên Linux không có tội, tội là thiết lập chưa đến mức an toàn, khi bạn cài linux chạy được thì nó chạy mặc định theo thiết lập PC chứ không phải thiết bị di động, cần phải tinh chỉnh nhiều thứ ...

Bây giờ, chúng ta vào khái niệm của Linux quản lý xung của nhân.

powersave
conservative
performance
interactive
ondemand
userspace

Đầu tiên là "powersave", mức thiết lập an toàn bảo vệ hệ thống, bạn có đặt min/max khác nhau, nó vẫn chạy ở min làm căn chuẩn. Ví dụ viết câu lệnh trong $ nano /etc/rc.local như sau

#!/bin/bash
cpufreq-set --cpu 0 -d 475000 -u 1300000 -g powersave

Thì linux chỉ chạy ở 475000 hz

"conservative" là powersave và có thể chạy max xung 1300000 hz, khi không có tác vụ nào thì nó hạ xung về 475000 hz

cpufreq-set --cpu 0 -d 475000 -u 1300000 -g conservative

"performance" ngược lại với powersave, luôn chạy max xung 1300000 hz

cpufreq-set --cpu 0 -d 475000 -u 1300000 -g performance

"interactive" chính là performance nhưng xung nhịp có thể thay đổi trong khoảng max/min

cpufreq-set --cpu 0 -d 475000 -u 1300000 -g interactive

"ondemand" cho linux tự động điều chỉnh xung nhịp, người dùng không cần quan tâm, chạy trên ARM không có tản nhiệt rất dễ quá nhiệt và treo máy

"userspace" người dùng thiết lập commandline hoặc trên phần mềm để chạy 1 xung cụ thể

Để ARM chạy tốt trên Linux, ta chỉ cần dùng powersave và conservative. Nhưng mặc định thường linux dùng "ondemand", nên phải disable ondemand bằng lệnh

$ sudo update-rc.d ondemand disable

hoặc:

$ sudo systemctl disable ondemand

$sudo rm -rf /etc/systemd/system/multi-user.target.wants/ondemand.service

Cài cpufrequtils và cpufreqd và quan tâm các file rc.local, cpufreqd.conf, cpufrequtils

/etc/rc.local
/etc/cpufreqd.conf
/etc/init.d/cpufrequtils

Thông thường các tập lệnh gọi cpu trên ARM rất khác nhau tùy theo hãng, có hãng gọi cpu0 ->cpu3 đối với 4 nhân, hoặc gọi cpu0 ->cpu4 ->cpu6 đối với 6, 8 hoặc 16 nhân.

Ví dụ: gọi cpu0 trong rc.local

Vào terminal -> htop thấy cpu4 cũng được gọi dùng

Mục đích chúng ta đặt ra là thiết bị chạy mượt và không bị quá nhiệt, thông thường thì hạ xung xuống 1/2 và số cpu cũng giảm xuống, rồi từ từ sử dụng dựa vào sensor đo nhiệt độ và tìm các xung, số nhân phù hợp. Ví dụ cách hạ như sau:

Xem các xung của nhân để thiết lập

$ cpufreq-info

$ nano /etc/rc.local

cpufreq-set --cpu 0 -d 475000 -u 475000 -g powersave

Sẽ gọi cpu0 và cpu4

$ nano /etc/init.d/cpufrequtils

Sửa dòng:

ENABLE="true"
GOVERNOR=powersave"
MAX_SPEED="0"
MIN_SPEED="0"

$ nano /etc/cpufreqd.conf

Chỉ dùng powersave và conservative, đại khái là:

[Profile]
name=Powersave High
minfreq=1100000
maxfreq=1100000
policy=powersave
[/Profile]

[Profile]
name=Powersave Medium
minfreq=1000000
maxfreq=1000000
policy=powersave
[/Profile]

[Profile]
name=Powersave Low
minfreq=475000
maxfreq=475000
policy=powersave
[/Profile]

[Profile]
name=Conservative High
minfreq=475000
maxfreq=1300000
policy=conservative
[/Profile]

[Profile]
name=Conservative Low
minfreq=475000
maxfreq=860000
policy=conservative
[/Profile]

##
# Basic states
##

[Rule]
name=AC Off -High Power
ac=off # (on/off)
#battery_interval=70-100
cpu_interval=70-90
#exec_post=echo 5 > /proc/acpi/sony/brightness
profile=Conservative Low
[/Rules]

[Rule]
name=AC Off -Medium Power
ac=off # (on/off)
#battery_interval=70-100
cpu_interval=50-70
#exec_post=echo 5 > /proc/acpi/sony/brightness
profile=Powersave High
[/Rules]

[Rule]
name=AC Off -Low Battery
ac=off # (on/off)
#battery_interval=0-30
cpu_interval=0-70
#exec_post=echo 3 > /proc/acpi/sony/brightness
profile=Conservative High
[/Rules]

##
# Special Rules
##
#CPU Too hot!
[Rule]
name=CPU Too Hot
#acpi_temperature=55-100
#battery_interval=0-100
tau_temperature=60-90
cpu_interval=90-100
profile=Powersave Low
[/Rules]

[Rule]
name=Movie Watcher
ac=off
programs=mplayer,mpv,RetroArch,dosbox,QEMU,xbmc,vcmi
#battery_interval=0-100
#acpi_temperature=0-60
tau_temperature=0-60
cpu_interval=0-90
profile=Powersave Medium
[/Rule]

Dùng rc.local để gọi nhân theo cách thủ công, cpufrequtils để bắt buộc linux chạy theo số nhân và xung theo rc.local. cpufreqd là thay đổi xung theo tình trạng pin, nhiệt và xung của nhân

Cài thêm cpufreq-indicator, hoặc các phần mềm hiển thị thông số cpu trên desktop. Hoặc cpufreq-info, cpufreqd-get, cài và config conky theo rpi3 của novaspirit

https://www.novaspirit.com/2017/02/23/desktop-widget-raspberry-pi-using-conky/

Desktop Widget for Raspberry Pi using Conky - Novaspirit

Hi! How to add a desktop system monitor widget to your desktop. this video was made possible because of your request through comments. thanks for the view!!
novaspirit.com


Chỉnh thông số swappiness và vfs_cache_pressure trong terminal

$ cat /proc/sys/vm/swappiness

$ cat /proc/sys/vm/vfs_cache_pressure

$ cat /proc/sys/vm/dirty_background_ratio

$ cat /proc/sys/vm/dirty_ratio

$ cat /proc/sys/vm/dirty_background_bytes

$ cat /proc/sys/vm/dirty_bytes

$ cat /proc/sys/vm/min_free_kbytes

$ sudo systcl -w vm.swappiness=1 #giá trị thay đổi từ 0 đến 100, mặc định là 60

$ sudo systcl -w vm.vfs_cache_pressure=2 #giá trị thay đổi từ 0 đến 500, mặc định là 100

$ sudo sysctl -w vm.dirty_background_ratio=1 #giá trị thay đổi từ 1 đến 10, mặc định là 10

$ sudo sysctl -w vm.dirty_ratio=20 #giá trị thay đổi từ 20 đến 50, mặc định là 20

$ sudo sysctl -w vm.dirty_background_bytes=16777216 #mặc định là 0

$ sudo sysctl -w vm.dirty_bytes=50331648

$ sudo sysctl -w vm.min_free_kbytes=33792

$ sudo sysctl -w vm.panic_on_oom=1

$ sudo sysctl -w kernel.panic=10

$ sudo sysctl -w vm.overcommit_memory=1

$ sudo sysctl -w vm.drop_caches=3

$ nano /etc/sysctl.conf

vm.swappiness=1
vm.vfs_cache_pressure=2
vm.dirty_background_ratio=1
vm.dirty_ratio=20
vm.dirty_background_bytes=16777216
vm.dirty_bytes=50331648
vm.min_free_kbytes=33792
vm.panic_on_oom=1
kernel.panic=10
vm.overcommit_memory=1
vm.drop_caches=3

$ sudo sysctl -p

Hiển thị nhiệt độ cpu ARM trong conky mỗi hãng mỗi khác:

Rpi: $ vcgencmd measure_temp

${exec /opt/vc/bin/vcgencmd measure_temp | cut -c6-9} #conky

ARM mainline kernel: $ cat /sys/devices/platform/hwmon/hwmon0/temp_input1

${hwmon 0 temp 1} #conky

Tegra: $ cat /sys/devices/platform/tegra-i2c.4/i2c-4/4-004c/temperature

${exec cat /sys/devices/platform/tegra-i2c.4/i2c-4/4-004c/ex_temperature} #conky

Chỉnh CPU frequency scaling về 80% up_threshold tham khảo
https://wiki.alpinelinux.org/wiki/CPU_farequency_scaling

Optimize ondemand governor:

https://forum.xda-developers.com/showthread.php?t=1778975

[MOD] Tweaked Ondemand V1.0.2 [28/07/12]

What this does: This mod sets your CPU governor to ondemand instead of the default interactive. Why? While it gives a smooth UI performance interactive ea…
forum.xda-developers.com


[***]Recommand config:

$ nano /etc/local.d/cpufreq.start

#!/bin/sh

# Set the governor to ondemand for all processors
for cpu in /sys/devices/system/cpu/cpufreq/policy*; do
echo ondemand > ${cpu}/scaling_governor
done

# Reduce the boost threshold to 10%
echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold

# Reduce the boost ignore_nice_load to 0
echo 0 > /sys/devices/system/cpu/cpufreq/ondemand/ignore_nice_load

# Reduce the boost io_is_busy to 0
echo 0 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy

# Reduce the boost powersave_bias to 300
echo 300 > /sys/devices/system/cpu/cpufreq/ondemand/powersave_bias

# Reduce the boost sampling_down_factor to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

# Reduce the boost sampling_rate to 5000
echo 5000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate

Battery config:

$ nano /etc/local.d/cpufreq.start

#!/bin/sh

# Set the governor to ondemand for all processors
for cpu in /sys/devices/system/cpu/cpufreq/policy*; do
echo ondemand > ${cpu}/scaling_governor
done


# Reduce the boost threshold to 95%
echo 95 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold


# Reduce the boost ignore_nice_load to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/ignore_nice_load


# Reduce the boost io_is_busy to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy


# Reduce the boost powersave_bias to 100 for minimum processor frequency
echo 100 > /sys/devices/system/cpu/cpufreq/ondemand/powersave_bias


# Reduce the boost sampling_down_factor to 4 for battery life
echo 4 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor


# Reduce the boost sampling_rate to 100000 for battery life
echo 100000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate


Aggressive config

$ nano /etc/local.d/cpufreq.start

#!/bin/sh

# Set the governor to ondemand for all processors
for cpu in /sys/devices/system/cpu/cpufreq/policy*; do
echo ondemand > ${cpu}/scaling_governor
done


# Reduce the boost threshold to 85%
echo 85 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold


# Reduce the boost ignore_nice_load to 0
echo 0 > /sys/devices/system/cpu/cpufreq/ondemand/ignore_nice_load


# Reduce the boost io_is_busy to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy


# Reduce the boost powersave_bias to 100 for minimum processor frequency
echo 100 > /sys/devices/system/cpu/cpufreq/ondemand/powersave_bias


# Reduce the boost sampling_down_factor to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor


# Reduce the boost sampling_rate to 30000
echo 30000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate


Balanced config
$ nano /etc/local.d/cpufreq.start


#!/bin/sh

# Set the governor to ondemand for all processors
for cpu in /sys/devices/system/cpu/cpufreq/policy*; do
echo ondemand > ${cpu}/scaling_governor
done


# Reduce the boost threshold to 90%
echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold


# Reduce the boost ignore_nice_load to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/ignore_nice_load


# Reduce the boost io_is_busy to 1
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy

loo
# Reduce the boost powersave_bias to 100 for minimum processor frequency
echo 100 > /sys/devices/system/cpu/cpufreq/ondemand/powersave_bias


# Reduce the boost sampling_down_factor to 2
echo 2 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor


# Reduce the boost sampling_rate to 50000
echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate


IMG_20200527_153548.jpg
IMG_20200527_203029.jpg
bài viết kì công vll :v
@SilverWolf501 Embedded linux phai chiu vay thoi, tu config tu a-z
  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2020 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: 209 Đường Nam Kỳ Khởi Nghĩa, Phường 7, Quận 3, TP.HCM
  • Số điện thoại: 02862713156
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019