Ozgur's Blog

Random ramblings of personal nature

AMD Ryzen ve Linux altında donma sorunu / AMD Ryzen and Freeze Under Linux


Türkçe

Linux kullanmaya başladığımdan bu yana oldukça tuhaf bir problem yaşıyordum. Bilgisayar normal operasyonlarda (yani oyun olsun, kod olsun, ofis işleri olsun) herhangi bir sorun olmadan çalışırken boş bıraktığımda (ne bileyim, kahve falan almaya gittiğimde) donma ya da tekrardan başlama sorunu yaşıyordum. Dürüst olmak gerekirse bu sorunu elektrik hattına bağlıyordum. Ancak hatları yeniledikten sonra da devam edince biraz daha detaylı bakmaya karar verdim.

Ortaya çıkan şey Ryzen işlemcilerin kullandığım Power Supply için fazla yeni olması gibi bir durumdu. Ryzen akıllı bir biçimde kullanılmayan çekirdeklerini derin uyku moduna (c6 modu olarak geçiyor bu) almaya çalışıyor ama power supply bunu desteklemediği için alet çakılıyor.

Bunu düzeltmek için iki yol var. Ya BIOS'tan ya da yazılımla C6 durumuna geçmesini engelleyeceksiniz.

BIOS - UEFI Metodu

Bu metodda yapmamız gereken iki adım var:

  • Anakartımızın Biosunu güncellemek (çünkü yeni gelmiş bir ayar bu)
  • BIOS/UEFI ayarlarından Power Supply Idle Control ayarını bularak bunu Typical Current Idle haline getirmek

Bu ayarı yaptıktan sonra bu sorunun olmaması gerekiyor. Bu bios güncellemesini yapmamızın temel sebebi, anladığım kadarıyla, Ryzenlar piyasaya sürüldüğünde kimsenin böyle bir sorun olduğunu farketmemesi. Ancak o dönemki güç kaynaklarının bu türden bir şeyi desteklemediği ortaya çıkınca AMD, bazı firmalar gibi "bize ne, gitsinler yeni PSU alsınlar" demeyerek böyle bir fix yaratıyor. Nitekim AMD'nin en sevdiğim tarafı bu, sizi böyle bir durum ortaya çıktığında ateşin içine atıp kaybolmuyorlar.

unraid 'den alıntılarsam:

[...]However, AMD understands that not everyone is in a position to replace their PSU with a contemporary 0A-rated unit. To help with that, AMD is also developing a firmware workaround for these power supplies, and will make it available through motherboard partners as a BIOS update in the future.

[...] Ancak AMD herkesin kendi güç kaynağını modern 0A-sınıfı bir birimle değiştirebilecek bir durumda olmadığını anlamaktadır. Bu yüzden AMD bu güç kaynaklarını da destekleyecek bir firmware çözümü geliştirmekte ve bu çözümü de ilerleyen zamanlarda anakart ortaklarının yayınlayacağı bir BIOS güncellemesi olarak erişilebilir kılacaktır.

Yazılım metodu

Eğer bu ayar güncellemeden sonra bile gelmediyse, bazı firmalar yapmayabiliyor bu güncellemeyi, reddit'ten aldığım şu adımları izleyin:

Uyku Durumunda

/etc/modules-load.d/msr.conf dosyasını yaratarak bu satırları ekleyin

# Load msr.ko module at boot
msr

ZenStates-Linux deposunu githubdan klonlayın

# git clone https://github.com/r4m0n/ZenStates-Linux.git

disable-c6.sh adında bir script yaratın:

1
2
3
4
5
6
#!/bin/sh
if [ "${1}" == "post" ]; then

#  Disable c6 coming out of sleep
/home/dk/Ryzen/ZenStates-Linux/zenstates.py --c6-disable
fi

Bunu çalıştırılabilir hale getirin

# chmod a+x disable-c6.sh

Test edin

# disable-c6.sh post

Sorun yoksa /usr/lib/systemd/system-sleep/ klasörüne kopyalayın

Yüklemede

disable-c6.service adında bir dosyayı /etc/systemd/system klasöründe yaratın ve bu satırları içine yazın:

[Unit]
Description=Disable C6 on boot
After=default.target

[Service]
Type=oneshot
ExecStart=/home/dk/Ryzen/ZenStates-Linux/zenstates.py --c6-disable

[Install]
WantedBy=default.target

Çalıştırın

# systemctl start disable-c6.service

Ve sistem yüklenirken de çalışmasını sağlayın

# systemctl enable disable-c6.service

Referanslar

  • https://www.reddit.com/r/Amd/comments/7tkigu/automating_disabling_of_c6_states_in_arch_linux/
  • https://www.hardwaresecrets.com/everything-you-need-to-know-about-the-cpu-c-states-power-saving-modes/6/
  • https://forums.unraid.net/topic/61767-amd-ryzen-update/

English

BIOS - UEFI Setting

Since I was using Linux I was having problems with the weirdest thing ever. Computer worked fine, can play games, watch videos but sometimes when it is idle (like when I went out to grab a coffee or smt) it froze or restarted itself under Linux. To be honest I blamed the electricity for this problem but after a renovation including the electrical wiring it continued to happen.

Well, turns out Ryzen is TOO SPANKING NEW for the PSU I was using. See, when the cpu thinks some of its cores are not used, it shuts them down for deep sleep(C6 state) BUT the power supply doesn't support this so this powering down results in a system lockup.

To fix this I needed to do two things:

  • Update Bios (I did this previously for an unrelated problem but still it is needed to enable the second step)
  • Find the Power Supply Idle Control in the BIOS settings and change it from auto to Typical Current Idle

After that the problem should go away. We need to update our bios to enable this option because, as far as I understood, when the Ryzens were first released nobody thought that would be a problem. But it turns out that most of the PSUs are unable to switch to this mode, so AMD created this fix to not to make us new power supplies supporting this mode. That's why I love AMD by the way. They don't leave you out to dry if something shifty like this happens.

To quote from unraid:

However, AMD understands that not everyone is in a position to replace their PSU with a contemporary 0A-rated unit. To help with that, AMD is also developing a firmware workaround for these power supplies, and will make it available through motherboard partners as a BIOS update in the future.

Software Method

If it doesn't exist even after the update you need to disable the C6 States by following these steps: (taken from reddit

On Sleep

Create /etc/modules-load.d/msr.conf and add these lines

# Load msr.ko module at boot
msr

Clone ZenStates-Linux from github from within /home/dk/Ryzen

# git clone https://github.com/r4m0n/ZenStates-Linux.git

Created a script disable-c6.sh

1
2
3
4
5
6
#!/bin/sh
if [ "${1}" == "post" ]; then

#  Disable c6 coming out of sleep
/home/dk/Ryzen/ZenStates-Linux/zenstates.py --c6-disable
fi

Make it executable

# chmod a+x disable-c6.sh

Test it

# disable-c6.sh post

And put it in /usr/lib/systemd/system-sleep/

On Boot

Create a file disable-c6.service in /etc/systemd/system that contains

[Unit]
Description=Disable C6 on boot
After=default.target

[Service]
Type=oneshot
ExecStart=/home/dk/Ryzen/ZenStates-Linux/zenstates.py --c6-disable

[Install]
WantedBy=default.target

Start it to disable C6 if it is currently enabled...

# systemctl start disable-c6.service

And get it to run on boot

# systemctl enable disable-c6.service

References

  • https://www.reddit.com/r/Amd/comments/7tkigu/automating_disabling_of_c6_states_in_arch_linux/
  • https://www.hardwaresecrets.com/everything-you-need-to-know-about-the-cpu-c-states-power-saving-modes/6/
  • https://forums.unraid.net/topic/61767-amd-ryzen-update/