تحليل سبب بطئ إقلاع نظام لينيكس

على الرغم من كون نظام لينيكس سريع ومصمم بشكل ممتاز إلا أنه في بعض المرات ومثل أي نظام آخر قد يتعرض للمشاكل التي يمكن حلها بسهولة في حال معرفتها. هذه المشاكل على الرغم من كونها غير متعلقة مباشرة بالنظام الا انها تد تتسبب بعمل تعارضات مع النظام مما يؤدي الى بطئ إقلاع النظام. بسبب كون لينيكس مفتوح المصدر، الوصول للمشاكل يعتبر أمر سهل جدا ومباشر ولا يتطلب أكثر من برنامج واحد و بضع أوامر.

قبل الدخول في شرح البرنامج يجب أن نشدد على موضوع الأقراص الصلبة وتأثيرها في عملية الإقلاع. في حال كان لديك قرص صلب عادي من نوع HDD، سيكون الإقلاع لديك بطيئ وهذا أمر طبيعي جدا. في هذه الحالة قد يستغرق النظام ما بين دقيقة و دقيقة ونصف حتى يُنهي عملية الإقلاع. بالمقارنة، من يملك قرص SSD أو NVMe قد يُنهي عملية الإقلاع ما بين 10 – 40 ثانية.

من المهم جدا أن تعلم أن فشل أحد الأقراص في العمل أو التنصيب خلال الإقلاع قد يعطل العملية ويطيلها بشكل كبير جدا لتصل الى دقيقتين على الأقل. حل هذه المشكلة يكون من خلال تغيير القرص في حال كان معطوب، أو فصله من النظام، أو التأكد من خيارات التنصيب وكوابل الطاقة والبيانات المتصلة بالقرص أو اللوحة الأم.

برنامج systemd-analyze

في حال انك مثل معظم الناس، سيكون نظامك من نوع systemd. كيف تعلم أنه ليس systemd؟ ستعلم ذلك لوحدك. جميع الأنظمة تعمل بنظام systemd ما عدا الأنظمة التي تختارها أنت بشكل خاص لتحتوي على شيء غير systemd. المهم! في حال كان نظامك من نوع systemd، برنامج systemd-analyze هو الحل الأفضل لتحليل زمن إقلاع نظامك وسبب تأخر أي عملية فيه.

البرنامج جزء من أي نظام من نوع systemd ولا يحتاج تثبيت.

معرفة زمن الإقلاع

للتعرف على زمن الإقلاع الأخير لنظامك، يمكنك تنفيذ الامر التالي في الطرفية:

systemd-analyze

ناتج هذا الأمر هو التالي بالنسبة لجهازي:

[ahmad@Ahmad-PC ~]$ systemd-analyze
Startup finished in 12.387s (firmware) + 10.145s (loader) + 2.674s (kernel) + 5.015s (userspace) = 30.222s  
graphical.target reached after 2.135s in userspace

تفسير الأمر:

  • 12.387s (firmware) هذه تعني أن نظام UEFI استغرق 12.3 ثانية.
  • 10.145s (loader) هذه تعني أن محمل الإقلاع استغرق 10.1 ثانية.
  • 2.674s (kernel) هذه تعني أن النواة استغرقت 2.6 ثانية.
  • 5.015s (userspace) هذه تعني أن كل ما يتعلق بي كمستخدم استغرق 5 ثواني.

من خلال هذا الأمر نرى أن العتاد الخاص بي استغرق تقريبا 22 ثانية ليعمل، ونظام لينيكس بالكامل استغرق 7 ثواني اضافية.

ملاحظة جانبية: نظام Coreboot مفتوح المصدر البديل لنظام UEFI قادر على اختصار الـ 22 ثانية الى أقل من 5 ثواني. نتمنى أن نرى هذا النظام متوفر في عدد أكبر من الأجهزة في المستقبل.

معرفة زمن تشغيل كل عملية في النظام خلال بدء التشغيل

لمعرفة الزمن المستغرق لتشغيل كل عملية تخص واجهة المستخدم، يمن تنفيذ الامر التالي:

systemd-analyze blame

هنا يتم ترتيب العمليات من التي استغرقت وقت أكبر الى الأقل استغراقا للوقت. نرى في جهازي أن عملية تشغيل الشبكة وإجراء اتصال بالإنترنت كانت هي الأبطأ واستغرقت 3.5 ثانية.

[ahmad@Ahmad-PC ~]$ systemd-analyze blame  
3.581s NetworkManager-wait-online.service                    
2.359s man-db.service                                        
886ms systemd-logind.service                                
822ms lvm2-monitor.service                                  
657ms snapd.service                                         
462ms systemd-random-seed.service                           
450ms dev-nvme0n1p2.device                                  
425ms apparmor.service                                      
394ms upower.service                                        
301ms systemd-udevd.service                                 
282ms tlp.service                                           
268ms systemd-journald.service                              
133ms [email protected]                                     
125ms org.cups.cupsd.service                                
116ms systemd-journal-flush.service                         
112ms polkit.service                                        
 96ms ldconfig.service                                      
 82ms udisks2.service                                       
 81ms run-media-ahmad-Data.mount                            
 71ms avahi-daemon.service                                  
 71ms logrotate.service                                     
 71ms run-media-ahmad-Games.mount                           
 69ms systemd-modules-load.service                          
 68ms systemd-tmpfiles-clean.service                        
 66ms NetworkManager.service                                
 58ms systemd-udev-trigger.service                          
 52ms ModemManager.service                                  
 34ms [email protected]                                  
 27ms boot-efi.mount                                        
 27ms systemd-sysusers.service                              
 22ms systemd-journal-catalog-update.service                
 19ms systemd-fsck@dev-disk-by\x2duuid-06ED\x2dA3F9.service
 16ms systemd-tmpfiles-setup.service                        
 15ms systemd-tmpfiles-setup-dev.service                    
 15ms systemd-binfmt.service                                
 13ms netdata.service                                       
 13ms [email protected]                         
 13ms colord.service                                        
 12ms snapd.apparmor.service                                
 11ms dev-hugepages.mount                                   
 11ms dev-mqueue.mount                                      
 10ms linux-module-cleanup.service                          
 10ms sys-kernel-debug.mount                                
 10ms sys-kernel-tracing.mount                              
  9ms tmp.mount                                             
  8ms kmod-static-nodes.service                             
  8ms systemd-update-done.service                           
  6ms systemd-update-utmp.service                           
  6ms systemd-remount-fs.service                            
  5ms systemd-sysctl.service                                
  5ms systemd-user-sessions.service                         
  4ms sys-fs-fuse-connections.mount                         
  3ms rtkit-daemon.service                                  
  2ms proc-sys-fs-binfmt_misc.mount                         
  1ms sys-kernel-config.mount                               
884us snapd.socket                                         

تحليل سبب بطء العملية

أعتقد ان من يعاني من بطئ بدء التشغيل سيكون هذا هو القسم الأهم بالنسبة له. في نظام systemd أنت قادر على معرفة أدق التفاصيل، والأمر التالي يعطيك كل عملية فرعية تمت من خلال العملية الرئيسية ويعطيك تفاصيل وقتها بدقة تصل الى نانو ثانية:

systemd-analyze critical-chain

للاستفادة من الأمر السابق في تحليل عملية معينة، يجب كتابة اسم العملية بعد الأمر كما في المثال التالي:

systemd-analyze critical-chain NetworkManager-wait-online.service

وهذه نتيجة الأمر لدي:

[ahmad@Ahmad-PC ~]$ systemd-analyze critical-chain NetworkManager-wait-online.service
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.

NetworkManager-wait-online.service +3.581s
└─NetworkManager.service @1.240s +66ms
 └─dbus.service @1.236s
   └─basic.target @1.232s
     └─sockets.target @1.232s
       └─snapd.socket @1.231s +884us
         └─sysinit.target @1.228s
           └─sys-fs-fuse-connections.mount @3.368s +4ms
             └─systemd-modules-load.service @220ms +69ms
               └─systemd-journald.socket @211ms
                 └─-.mount @195ms
                   └─system.slice @195ms
                     └─-.slice @195ms

عند إشارة @ هو زمن تشغيل الخدمة، و عند اشارة الزائد هو الزمن الذي استغرقته الخدمة للعمل بشكل كامل. مثلا خدمة FUSE استغرقت 3.3 ثانية للبدء و استغرقت 4 أجزاء من الثانية لتكتمل وتسمح للنظام بالانتقال الى المهمة التالية.