25/10/2019, 15:32

Tìm hiểu về thư viện Sigar

I. Mở đầu Dạo trước, lúc mình vẫn còn làm nhiều application desktop (code bằng Java), mình có gặp phải bài toán như này: Khi app chạy một job (đa luồng -multi thread) 24/24, cần phải luôn đảm bảo sử dụng CPU + RAM của máy ko tăng quá cao. Số lượng luồng thực thi công việc phải tự điều ...




I. Mở đầu


Dạo trước, lúc mình vẫn còn làm nhiều application desktop (code bằng Java), mình có gặp phải bài toán như này: Khi app chạy một job (đa luồng -multi thread) 24/24, cần phải luôn đảm bảo sử dụng CPU + RAM của máy ko tăng quá cao. Số lượng luồng thực thi công việc phải tự điều chỉnh theo cấu hình của máy. (Sử dụng 60% RAM và CPU lúc chạy không được vượt quá 90%)

Mới đầu tiếp nhận vấn đề này, mình cũng tìm kiếm, tra cứu khá nhiều, mất khá nhiều thời gian, công sức để chạy các demo, cũng như so sánh đối chiếu với thông số thật của máy tính. Cuối cùng sau khoảng 3, 4 ngày thì mình có tìm được một thư viện hoàn toàn đáp ứng được nhu cầu của bản thân mình. Đó là thư viện Sigar.



II. Sigar là gì?


Sigar là một thư viện phần mềm miễn phí (theo Giấy phép Apache ) cung cấp giao diện lập trình đa ngôn ngữ, đa nền tảng cho thông tin cấp thấp về phần cứng máy tính và hoạt động của hệ điều hành. Thư viện cung cấp các ràng buộc cho nhiều ngôn ngữ máy tính phổ biến và đã được chuyển đến hơn 25 kết hợp hệ điều hành/ phần cứng khác nhau. Sigar là viết tắt của System Information Gatherer And Reporter và ban đầu được phát triển bởi Doug MacEacéc , tác giả của mô-đun mod_perl phổ biến cho máy chủ web Apache.



III. Hướng dẫn sử dụng thư viện (ngôn ngữ java + sử dụng Intellij)


1. Thêm thư viện Sigar vào project


Bước 1: Tạo một project maven có tên: demo-sigar



Bước 2: Add các dependency sau

<dependency>
   <groupId>org.fusesource</groupId>
   <artifactId>sigar</artifactId>
   <version>1.6.4</version>
</dependency>
<dependency>
   <groupId>io.kamon</groupId>
   <artifactId>sigar-loader</artifactId>
   <version>1.6.6-rev002</version>
</dependency>


2. Cấu trúc project demo



3. Các class


Class Infor:


package com.example.demosigar;

import java.util.ArrayList;
import java.util.List;

import lombok.Data;

@Data
public class Infos {

   private long pid;
   private String fqdn;
   private String hostname;
   private double uptime;
   private Cpu cpu = new Cpu();
   private Mem mem = new Mem();
   private Swap swap = new Swap();
   private List<Interface> interfaces = new ArrayList<>(2);

   @Data
   public static class Cpu {
       private long sys;
       private long total;
       private long user;
   }

   @Data
   public static class Mem {
       private long total;
       private long used;
       private long free;
   }

   @Data
   public static class Swap {
       private long total;
       private long used;
       private long free;
   }

   @Data
   public static class Interface {
       private String name;
       private String type;
       private String address;
   }
}

Class SigarService


package com.example.demosigar;

import kamon.sigar.SigarProvisioner;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class SigarService {

   private final Sigar sigar;

   public SigarService() {
       Sigar sigar = null;
       try {
           SigarProvisioner.provision();
           sigar = new Sigar();
           // call it to make sure the library was loaded
           sigar.getPid();
       } catch (Exception ignored) {
       }
       this.sigar = sigar;
   }

   public Infos infos() {

       Infos infos = new Infos();
       try {
           infos.setPid(sigar.getPid());
           infos.setFqdn(sigar.getFQDN());
           infos.setHostname(sigar.getNetInfo().getHostName());
           infos.setUptime(sigar.getUptime().getUptime());

           String[] netInterfaceList = sigar.getNetInterfaceList();
           for (String netInterfaceName : netInterfaceList) {
               // Add net interface
               NetInterfaceConfig config = sigar.getNetInterfaceConfig(netInterfaceName);
               Infos.Interface netInterface = new Infos.Interface();
               netInterface.setName(config.getName());
               netInterface.setType(config.getType());
               netInterface.setAddress(config.getAddress());
               infos.getInterfaces().add(netInterface);
           }

           // Add cpu
           infos.getCpu().setSys(sigar.getThreadCpu().getSys());
           infos.getCpu().setTotal(sigar.getThreadCpu().getTotal());
           infos.getCpu().setUser(sigar.getThreadCpu().getUser());

           // Add mem
           infos.getMem().setTotal(sigar.getMem().getTotal());
           infos.getMem().setUsed(sigar.getMem().getUsed());
           infos.getMem().setFree(sigar.getMem().getFree());

           // Add swap
           infos.getSwap().setTotal(sigar.getSwap().getTotal());
           infos.getSwap().setUsed(sigar.getSwap().getUsed());
           infos.getSwap().setFree(sigar.getSwap().getFree());

       } catch (SigarException ignored) {
       }

       return infos;
   }
}

Class ApplicationMain


package com.example.demosigar;

public class ApplicationMain {
   public static void main(String[] args) {
       SigarService sigarService = new SigarService();

       System.out.println("Mem total: " + sigarService.infos().getMem().getTotal());
       System.out.println("Mem used: " + sigarService.infos().getMem().getUsed());
       System.out.println("Mem free: " + sigarService.infos().getMem().getFree());
   }
}

4. Kết quả chạy trương trình



Kết quả ở đây chỉ dung lượng Ram đơn vị tính theo Byte



Ở đây mình làm là ví dụ demo nên chỉ hiển thị memory để test. Còn về vận dụng các bạn có thể lấy được rất nhiều thông số về phần cứng và hệ điều hành của máy.

Hi vọng bài viết của mình sẽ giúp ích được cho các bạn. Cảm ơn!

0