Hope is a Dream. Dream is a Hope.

非公開ふぃふぃ工房ブログは再開しました。

Raspberry Pi 3 Model B の起動時間の高速化

ラズパイを使ってIoTデバイスを作りテストを行っている。 PoCに耐えきれるかテストするため、電源のON/OFFテスト1000回や、周辺デバイスの調子が悪い環境での動作テスト1000回ノック等をやっている。 こうも起動回数が増えてくると、起動時間の長さが気になってきたので、高速化を検討した。

結果(今回の場合だと) 起動時間 10秒5秒短縮されたので、備忘録を兼ねて記事にした。

ラズパイの起動時間を調べる

現在の状態での起動時間を調べる。

現状10秒かかっている。

$ systemd-analyze time

Startup finished in 2.117s (kernel) + 8.655s (userspace) = 10.772s

$ systemd-analyze blame

          5.020s hciuart.service
          3.711s apt-daily.service
          1.464s apt-daily-upgrade.service
          1.446s dev-mmcblk0p2.device
           617ms keyboard-setup.service
           505ms raspi-config.service
           449ms networking.service
           424ms dphys-swapfile.service
           416ms ssh.service
           406ms systemd-fsck@dev-disk-by\x2dpartuuid-8fadf6a9\x2d01.service
           343ms systemd-timesyncd.service
           326ms rsyslog.service
           280ms systemd-udev-trigger.service
           280ms systemd-udevd.service
           277ms wpa_supplicant.service
           230ms dhcpcd.service
           223ms systemd-fsck-root.service
           221ms systemd-tmpfiles-setup-dev.service
           218ms systemd-logind.service
           175ms avahi-daemon.service
           169ms plymouth-start.service
           168ms systemd-journald.service
           151ms sys-kernel-debug.mount
           130ms run-rpc_pipefs.mount
           125ms fake-hwclock.service
           125ms systemd-remount-fs.service
           122ms triggerhappy.service
           120ms dev-mqueue.mount
           120ms kmod-static-nodes.service
           120ms systemd-journal-flush.service
           113ms bluetooth.service
           107ms systemd-rfkill.service
           105ms systemd-random-seed.service
            90ms wifi-country.service
            84ms systemd-tmpfiles-setup.service
            81ms user@1000.service
            81ms systemd-modules-load.service
            71ms systemd-sysctl.service
            66ms alsa-restore.service
            64ms systemd-update-utmp.service
            56ms sys-kernel-config.mount
            52ms systemd-update-utmp-runlevel.service
            52ms console-setup.service
            49ms boot.mount
            49ms nfs-config.service
            44ms rc-local.service
            33ms plymouth-read-write.service
            30ms plymouth-quit.service
            30ms plymouth-quit-wait.service
            21ms systemd-user-sessions.service

$ systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

graphical.target @8.494s
└─multi-user.target @8.493s
  └─hciuart.service @3.470s +5.020s
    └─basic.target @3.275s
      └─sockets.target @3.265s
        └─triggerhappy.socket @3.265s
          └─sysinit.target @3.256s
            └─systemd-timesyncd.service @2.908s +343ms
              └─systemd-tmpfiles-setup.service @2.802s +84ms
                └─local-fs.target @2.755s
                  └─boot.mount @2.701s +49ms
                    └─systemd-fsck@dev-disk-by\x2dpartuuid-8fadf6a9\x2d01.service @2.278s +406ms
                      └─dev-disk-by\x2dpartuuid-8fadf6a9\x2d01.device @2.274s

サービスの起動を追っていくと、 hciuart.service5秒もかかっているぞ。

$ systemctl | grep running

init.scope                        loaded active running   System and Service Manager                                                            
session-c4.scope                  loaded active running   Session c4 of user pi                                                                 
session-c5.scope                  loaded active running   Session c5 of user pi                                                                 
avahi-daemon.service              loaded active running   Avahi mDNS/DNS-SD Stack                                                               
bluetooth.service                 loaded active running   Bluetooth service                                                                     
cron.service                      loaded active running   Regular background program processing daemon                                          
dbus.service                      loaded active running   D-Bus System Message Bus                                                              
dhcpcd.service                    loaded active running   dhcpcd on all interfaces                                                              
getty@tty1.service                loaded active running   Getty on tty1                                                                         
hciuart.service                   loaded active running   Configure Bluetooth Modems connected by UART                                          
rsyslog.service                   loaded active running   System Logging Service                                                                
ssh.service                       loaded active running   OpenBSD Secure Shell server                                                           
systemd-journald.service          loaded active running   Journal Service                                                                       
systemd-logind.service            loaded active running   Login Service                                                                         
systemd-timesyncd.service         loaded active running   Network Time Synchronization                                                          
systemd-udevd.service             loaded active running   udev Kernel Device Manager                                                            
triggerhappy.service              loaded active running   triggerhappy global hotkey daemon                                                     
user@1000.service                 loaded active running   User Manager for UID 1000                                                             
wpa_supplicant.service            loaded active running   WPA supplicant                                                                        
avahi-daemon.socket               loaded active running   Avahi mDNS/DNS-SD Stack Activation Socket                                             
dbus.socket                       loaded active running   D-Bus System Message Bus Socket                                                       
syslog.socket                     loaded active running   Syslog Socket                                                                         
systemd-journald-dev-log.socket   loaded active running   Journal Socket (/dev/log)                                                             
systemd-journald.socket           loaded active running   Journal Socket                                                                        
systemd-udevd-control.socket      loaded active running   udev Control Socket                                                                   
systemd-udevd-kernel.socket       loaded active running   udev Kernel Socket                                                                    
triggerhappy.socket               loaded active running   triggerhappy.socket                                                                   
                                                              

どうも Bluetooth関連のサービスである。 今回、Bluetoothは不要なので、bluetooth.service と一緒に停止する

bluetooth.service                 loaded active running   Bluetooth service                                                                     
hciuart.service                   loaded active running   Configure Bluetooth Modems connected by UART                                          

bluetooth関連サービスの停止

BT関連のサービスを2つ停止

sudo systemctl disable bluetooth.service
sudo systemctl disable hciuart.service

再起動後の起動時間計測結果

$ systemd-analyze time

Startup finished in 1.842s (kernel) + 4.153s (userspace) = 5.995s

$ systemd-analyze blame

          1.353s dev-mmcblk0p2.device
           648ms keyboard-setup.service
           625ms dphys-swapfile.service
           433ms systemd-fsck@dev-disk-by\x2dpartuuid-8fadf6a9\x2d01.service
           411ms networking.service
           367ms ssh.service
           341ms systemd-timesyncd.service
           295ms rsyslog.service
           292ms systemd-udev-trigger.service
           261ms wpa_supplicant.service
           253ms systemd-udevd.service
           250ms systemd-fsck-root.service
           240ms raspi-config.service
           216ms kmod-static-nodes.service
           212ms systemd-tmpfiles-setup-dev.service
           204ms plymouth-start.service
           196ms dhcpcd.service
           174ms avahi-daemon.service
           172ms dev-mqueue.mount
           161ms fake-hwclock.service
           158ms systemd-journald.service
           142ms run-rpc_pipefs.mount
           138ms systemd-modules-load.service
           131ms sys-kernel-debug.mount
           128ms systemd-logind.service
           123ms systemd-remount-fs.service
           113ms systemd-journal-flush.service
            99ms triggerhappy.service
            95ms systemd-tmpfiles-setup.service
            91ms user@1000.service
            90ms alsa-restore.service
            83ms systemd-random-seed.service
            77ms systemd-update-utmp.service
            65ms systemd-rfkill.service
            60ms wifi-country.service
            46ms systemd-sysctl.service
            44ms plymouth-read-write.service
            36ms console-setup.service
            33ms plymouth-quit-wait.service
            33ms rc-local.service
            32ms boot.mount
            32ms plymouth-quit.service
            31ms systemd-user-sessions.service
            31ms sys-kernel-config.mount
            30ms nfs-config.service
            28ms systemd-update-utmp-runlevel.service


$ systemd-analyze critical-chain

graphical.target @4.117s
└─multi-user.target @4.117s
  └─ssh.service @3.749s +367ms
    └─network.target @3.724s
      └─wpa_supplicant.service @3.462s +261ms
        └─dbus.service @3.278s
          └─basic.target @3.257s
            └─sockets.target @3.253s
              └─triggerhappy.socket @3.249s
                └─sysinit.target @3.230s
                  └─systemd-timesyncd.service @2.886s +341ms
                    └─systemd-tmpfiles-setup.service @2.773s +95ms
                      └─local-fs.target @2.756s
                        └─boot.mount @2.718s +32ms
                          └─systemd-fsck@dev-disk-by\x2dpartuuid-8fadf6a9\x2d01.service @2.275s +433ms
                            └─dev-disk-by\x2dpartuuid-8fadf6a9\x2d01.device @2.271s

結果

// 前
Startup finished in 2.117s (kernel) + 8.655s (userspace) = 10.772s
// 後
Startup finished in 1.842s (kernel) + 4.153s (userspace) = 5.995s

起動時間が10秒から5秒に短縮されました。

(おまけ) 起動時のメッセージを抑制

ほとんど早くなりませんが。起動を目視していると、表示項目が少し減るので、気持ち早く感じました。

/boot/cmdline.txtの末尾に「quiet」を追加して、起動時のメッセージを抑制します。 参考

$ systemd-analyze time
Startup finished in 1.464s (kernel) + 3.909s (userspace) = 5.373s

以上

Roland UA-25 ドライバ Windows10対応

f:id:hope_is_dream:20190406164434p:plain

PCの音がならないぞ!

f:id:hope_is_dream:20190406164637j:plain

10年愛用しているオーディオインターフェイスが動かなくなった。 ランプがつかない。。 壊れたか。。

。。

Windows10にアップデートしたせいか??と思いドライバを探したら、Win10には対応していないもよう。

解決法

heetnote.com

UA25はWin10では動作保証外らしい!!!!もう結構な歳なのね。現役で使い続けているのにありがとう。 Win10でも動作させるハック見つけました。本当にありがとうございます。

f:id:hope_is_dream:20190406164702j:plain

せいや!復活!まだ頑張ってもらうよー

C#でWindowsのCPU使用率を取得する方法

CPUの使用率をアプリに表示したいよね。 でも、マルチコアとかだと意外と面倒。 以下に、クラス化したので使ってください。

内部タイマーを使って、バッファをためます。 それを取得して使うだけ。

List<SingleCPUManager> SingleCPUList = new List<SingleCPUManager>();

// Initialize
for (int i = 0; i<SingleCPUManager.GetCPUCount(); i++)
{
    SingleCPUList.Add(new SingleCPUManager(i, 200, 4, 30));
}

// Load Data
int Ncpu = Environment.ProcessorCount;
for (int k = 0; k<Ncpu; k++)
{
    SingleCPUManager scpu = SingleCPUList[k];
    float[] cpu_values = scpu.GetQueBuffer().ToArray();
}

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace SimScreenSaver
{

    /// <summary>
    /// CPUマネージャー
    /// </summary>
    public class SingleCPUManager
    {



        PerformanceCounter Counter;
        int BufferLength;

        public int CPUIndex;

        int Tap;

        List<float> QueBuffer;
        private System.Windows.Forms.Timer timer;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="index">CPU番号</param>
        /// <param name="buffer_length">バッファ長さ</param>
        /// <param name="tap">移動平均tap</param>
        public SingleCPUManager(int index, int buffer_length, int tap, int interval_ms)
        {

            // Param
            this.BufferLength = buffer_length;
            this.CPUIndex = index;
            this.Tap = tap;
            if (this.Tap <= 0) this.Tap = 1;

            // Init
            Init();

            // タイマーの間隔(ミリ秒)
            timer = new System.Windows.Forms.Timer();
            timer.Interval = interval_ms;
            timer.Tick += Timer_Tick;
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            Update();
        }

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="index"></param>
        /// <param name="buffer_length"></param>
        void Init()
        {
            // CPUカウンタ
            Counter = new PerformanceCounter("Processor", "% Processor Time", CPUIndex.ToString());

            // バッファ
            QueBuffer = new List<float>();

            // バッファの初期化
            for (int i = 0; i < BufferLength; i++)
            {
                QueBuffer.Add(0.0f);
            }
        }

        /// <summary>
        /// アップデート
        /// バッファにデータを追加
        /// </summary>
        void Update()
        {
            float v = Counter.NextValue();

            // 移動平均

            float ave = 0;
            for (int i = 0; i < Tap - 1; i++)
            {
                ave += QueBuffer[(QueBuffer.Count - 1) - i];
            }
            ave += v;
            ave /= Tap;
            v = ave;

            QueBuffer.Add(v);
            QueBuffer.RemoveAt(0);
        }


        /// <summary>
        /// バッファを渡す
        /// </summary>
        /// <returns></returns>
        public List<float> GetQueBuffer()
        {
            return QueBuffer;
        }

        /// <summary>
        /// Utilities
        /// </summary>
        /// <returns></returns>
        static public int GetCPUCount()
        {
            return Environment.ProcessorCount;
        }

    }
}