Thảo luận – Brainstroming về bài toán tiết kiệm năng lượng cho Linux/Android.

Khi chúng ta lập trình embedded Linux trên các hệ thống sử dụng điện từ nguồn thì vấn đề năng lượng chắc ít ai quan tâm. Tuy nhiên đối với hệ thống Linux sử dụng pin thì năng lượng là một thứ rất quan trọng. Thời gian sử dụng pin có thể là một tiêu chí sánh ngang với cấu hình cpu, ram…

Vào năm 2005 chiếc điện thoại black berry 8700 ra đời với 16m ram, pin 1100mAh. Hiện tại một chiếc điện thoại thông minh bình thường có ram 6G, pin 4000mAh. Như vậy, cấu hình điện thoại đã tăng lên khoảng 400 lần trong 15 năm, tuy nhiên, dung lượng pin chỉ tăng 4 lần. Hệ quả dẫn đến dung lượng pin không theo kịp cấu hình phần cứng. Do đó bài toán tiết kiệm năng lượng cho hệ điều hành được ra đời.

Linux kernel được thiết kế cho các máy tính dạng PC, vì vậy khả năng tiết kiệm năng lượng của nó còn khá nhiều hạn chế. Android được xây dựng dựa trên Linux, và tất nhiên nó kế thừa hệ thống quản lý năng lượng của Linux kernel. Android không can thiệp vào kernel để tiết kiệm năng lượng, thay vào đó nó triển khai một hệ thống framework riêng ở tầng user-space với mục đích tiết kiệm năng lượng. Các ứng dụng có thể bắt được các sự kiện sleep/wakeup của hệ thống, từ đó ngừng luồng xử lý của mình. Ngoài ra, Android còn có cơ chế riêng trong việc cấp cpu cho các ứng dụng.

Vậy giải pháp cần được đưa ra ở đây là gì?
Các bước cần thực hiện để tối ưu OS nhằm mục đích tiết kiệm năng lượng:

  • Liệt kê tất cả các ứng dụng ở tầng user-space, bao gồm các daemon process của Linux, java application của Android xem chúng đã xử lý sự kiện suspend/wakeup một cách đúng đắn chưa. Khi sự kiện suspend xảy ra thì ứng dụng phải xử lý bằng cách giảm thiểu luồng xử lý của mình một cách tối đa.
  • Liệt kê tất cả các driver/hardware module trong hệ thống. Loại bỏ các module không cần thiết.
    (Ví dụ như SoC của bạn có module ethernet, tuy nhiên hệ thống của bạn sử dụng wifi thì tốt nhất bạn nên xóa node ethernet trong device tree và xóa ethernet driver trong code kernel).
  • Kiểm tra tất cả các driver xem chúng đã xử lý sự kiện suspend của hệ thống hay chưa. Trong hàm suspend của driver nên dừng các hẹn giờ mà chúng tạo ra, tắt đồng hồ, lưu trữ dữ liệu vào bộ nhớ.
  • Kiểm tra driver của cpu xem chúng có freeze core mỗi khi hệ thống trong trại thái ngủ không.
  • Kiểm tra driver của GPU xem nó có dừng thực sự khi hệ thống trong trạng thái ngủ hay không.
  • Triển khai tính năng đồng hồ động cho bộ điều khiển đồng hồ. Thay vì module clock của hệ thống cấp 1 xung nhịp cố định ứng với mỗi thiết bị thì nên cấp động. Ví dụ như khi thiết bị làm việc không hết tải thì tốc độ xung nhịp cấp cho nó sẽ thấp, khi làm việc hết tải thì cấp xung nhịp cao hơn. Thông thường tần số làm việc cũng như mức độ tiêu thụ của 1 thiết bị phần cứng sẽ phụ thuộc rất nhiều vào tốc độ xung nhịp mà nó nhận.
  • Vô hiệu hóa các phần ram đang không hoạt động để hệ thống không phải cấp điện nuôi ram.
  • Gọi ra thread clear cached của kernel nếu như thiết bị đi vào trạng thái ngủ lâu hơn 1 khoảng thời gian cho trước, (ví dụ như 10 phút chẳng hạn).
  • Liệt kê các thread của kernel, nên dừng hoặc giãn cách xử lý các thread đó nếu có thể.

Tiết kiệm năng lượng là một bài toán cần giải quyết tăng dần thông qua nhiều phiên bản của sản phẩm. Nó cũng giống như việc bổ sung tính năng mới hoặc quy trình xử lý tối ưu cho sản phẩm. Cần phải thực hiện một cách lâu dài và liên tục nghiên cứu những cách tối ưu mới.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top