1. bash / Говнокод #23575

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    #!/bin/sh
    # 
    # Simple script to enable CPU cores automatically again if cooling state is
    # 3 or lower.
    #
    
    set -e
    
    get_cooling_state() {
            echo $(cat /sys/devices/virtual/thermal/cooling_device0/cur_state)
    }
    
    enable_cpu() {
            if [ $(cat /sys/devices/system/cpu/cpu$1/online) = 0 ]; then
                    echo 1 > /sys/devices/system/cpu/cpu$1/online || true
            fi
    }
    
    while true; do
            for c in 0 1 2 3; do
                    if [ $(get_cooling_state) -le 3 ]; then
                            enable_cpu $c
                    fi
            done
            sleep 5
    done

    Вот такой замечательный код занимается защитой процессора в стандартных сборках под OrangePi на Allwinner H5
    https://github.com/orangepi-xunlong/OrangePiH5_scripts/blob/master/platform-scripts/OrangePi_corekeeper.sh
    Думаю, говорить о том, как такой код работает, и насколько лучше был бы тут простенький скрипт, скажем, на питоне, смысла нет

    Запостил: losetup, 10 Декабря 2017

    Комментарии (23) RSS

    • >как такой код работает
      хорошо работает?
      > и насколько лучше был бы тут простенький скрипт
      практически ни на сколько?
      Ответить
      • да хуже бы было. это же распберри. и шелл там аш - "быстро и сердито". на питоне такое переписывать это что по воробьям из пушки. (а на ц - для экономии энергии/этц - можно было бы. но распы вроде от батареек редко питаются.)

        но с другой стороны, сам скрипт слегка пахнет. для чего-то постоянно бегущего, можно было бы слегка получше сделать. типа `echo $(cat /sys/devices/virtual/thermal/cooling_device0/cur_state)` - this is "an ox, and a moron". `while true;` -> `while : ;`
        Ответить
        • > `while true;` -> `while : ;`
          А нафиг? Экономии поди и не выйдет, если true вшито в шелл, а читаемость упала.
          Ответить
          • `true` это все равно комманда. а `:` это отсутствие комманды, которое (в данном случае) только exit status в ноль сбросит. на большинстве борн шеллов слегка быстрее.

            $ time bash -c 'while true; do let a=a+1; [ $a -gt 100000 ] && break; done'
            real    0m3.596s
            user    0m3.275s
            sys     0m0.250s
            
            $ time bash -c 'while true; do let a=a+1; [ $a -gt 100000 ] && break; done'
            real    0m3.720s
            user    0m3.400s
            sys     0m0.296s
            
            $ time bash -c 'while true; do let a=a+1; [ $a -gt 100000 ] && break; done'
            real    0m3.576s
            user    0m3.275s
            sys     0m0.249s
            
            $ time bash -c 'while :; do let a=a+1; [ $a -gt 100000 ] && break; done'
            real    0m3.465s
            user    0m3.166s
            sys     0m0.264s
            
            $ time bash -c 'while :; do let a=a+1; [ $a -gt 100000 ] && break; done'
            real    0m3.452s
            user    0m3.104s
            sys     0m0.343s
            
            $ time bash -c 'while :; do let a=a+1; [ $a -gt 100000 ] && break; done'
            real    0m3.503s
            user    0m3.181s
            sys     0m0.326s
            
            $

            ЗЫ тест слегка кривой потому что под цигвином.
            Ответить
            • Мне кажется, что на одно true в 5 секунд всем насрать :) Особенно когда рядом поднимают 4 cat'а.

              Да и выжимать из шелл скрипта максимальный пирфоманс - это уже, имхо, на грани извращения...
              Ответить
              • но когда uptime полгода, и этот шеллскрипт накрутит 2-3 часа CPU времени, меня лично начинает жаба давить, и я переписывают на ц.
                Ответить
                • > на ц
                  По идее, эта фишка вообще должна была уйти патчем в ядро... Там вроде можно подписаться на ивент от термалзоны и вообще не поллить.
                  Ответить
                  • вполне вероятно что тот `sleep 5` там служит тормозом, что бы не слишком часто процы пинать. спать лучше/проще в юзерспэйсе. плюс, не все kernel API - о ирония - доступны из самого кернела.
                    Ответить
                    • Да, возможно. Но "включить ядра через N секунд после остывания" и в ядре несложно запилить.

                      > спать лучше/проще в юзерспэйсе
                      Ну это если ивенты от термалзон вообще можно поймать в юзерспейсе...
                      Ответить
                    • З.Ы. Кстати интересно, а на каком ядре исполняется этот скрипт? При перегреве отключаются 3 ядра, а последнее остаётся работать?

                      З.З.Ы. Судя по картинке там есть ещё пятое low power ядро, видимо на нём.
                      Ответить
                      • хез. тут же проверка стоит: если "thermal/cooling_device0" чего-то, то тогда включить ядро. похоже на случай если ядро выключилось от перегрева, потому что активное охлаждение не успело включится. а скрипт проверяет что типа если активно что-то охлаждается, то его можно включить.

                        надо смотреть на само железо, что бы понять какие грабли тут обходят.
                        Ответить
                        • > надо смотреть на само железо
                          Походу в cpu_budget_cooling.c у них собака порылась. Этот код умеет отключать ядра при повышении cooling state процессора, но не умеет включать их обратно. А в sunxi-cpu-budget-cooling.c можно увидеть интересные таблички, где показан маппинг cooling state на количество ядер и их частоты.

                          К сожалению Allwinner H5 (SUN50I) в этой табличке нету, видимо мне попались слишком старые исходники. А в новых, где H5 упоминается, уже нету этой херни с отключением - при повышении cooling state только частоту скидывают. Есть вероятность, что скрипт из топика уже и не нужен...

                          https://github.com/allwinner-zh/linux-3.4-sunxi/tree/master/drivers/thermal
                          Ответить
                          • З.Ы. Походу, скрипт из топика - атавизм, доставшийся от Orange Pi на Allwinner H3 (SUN8IW7), где он был актуален.

                            З.З.Ы. Блин, из-за этих ваших allwinner'ов сегодня в кружочки не успел поиграть :(
                            Ответить
                            • Какие там скорости в кружочках уже?
                              Помню, в прошлый раз уже были околосветовые.
                              Ответить
                              • Да слишком стар я, походу, для этого дерьма.

                                Левая лапка выше 180BPM так и не хочет жать, да и до 180 дотягивает только после часового прогрева... Мозги тормозят - карты типа той, что была в ролике, адекватно процессят только если хорошо выспаться.

                                Поэтому прогресса почти нету. Боюсь, что это мой hard-limit.
                                Ответить
                                • Уже заебавшая всех шутка: обучи нейросеть играть в кружочки, чтобы она там всех унизила.
                                  Ответить
                                  • > обучи нейросеть
                                    Да можно, но тогда её ещё придётся учить играть на камеру...
                                    Ответить
                                  • >обучи нейросеть играть в кружочки, чтобы она там всех унизила.

                                    Ну в шахматы же научили.
                                    И нейросеть всех унизила.
                                    Как ранее в го и сёги.
                                    Ответить
    • > занимается защитой процессора
      Скорее борется с защитой процессора...
      Ответить
    • OSPM policy на bash, лол
      Ответить
    • Это говно нахуй!
      Нормальные люди пишут защиту и вшивают в ядро
      Ответить

    Добавить комментарий