zoukankan      html  css  js  c++  java
  • 115.python获取服务器信息

    1.产生原因

    项目需求获取服务器一段时间之内的cpu使用率,内存使用率等信息.由于数据会被多人访问,所以采用python元类的方式创建单例模式,每个请求访问的都是同一个对象.同时通过linux的sar命令获取相关信息,加载在内存中,其中我限制了返回数据的列表长度200(自己调整就行了),同时这个东西其实在写入数据的时候最好使用异步任务celery获者python apscheduler模块.
    

    2.代码实现

    import os, re, datetime
    import threading
    
    
    class SingletonType(type):
        _instance_lock = threading.Lock()
    
        def __init__(self, *args, **kwargs):
            super(SingletonType, self).__init__(*args, **kwargs)
    
        def __call__(cls, *args, **kwargs):
            if not hasattr(cls, "_instance"):
                with cls._instance_lock:
                    if not hasattr(cls, "_instance"):
                        cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
            return cls._instance
    
    
    class ServerInfo(metaclass=SingletonType):
    
        def __init__(self):
            self.time_list = []
            self.dick_read_list = []
            self.dick_write_list = []
            self.net_read_list = []
            self.net_write_list = []
            self.cpu_use_list = []
            self.mem_use_list = []
    
        def get_data(self):
            self.set_server_info()
            data = self.get_server_info()
            return data
    
        def get_server_info(self):
            self.check_list_length()
            data = {"cpu_use": self.cpu_use_list,
                    "mem_use": self.mem_use_list,
                    "disk_read": self.dick_read_list,
                    "dick_write": self.dick_write_list,
                    "net_read": self.net_read_list,
                    "net_write": self.net_write_list,
                    "time": self.time_list}
            return data
    
        def set_server_info(self):
            # 磁盘io情况
            rev = os.popen("sar -b 1 1").readlines()
            i_rev = re.findall('(S+)', rev[-1])[-3]
            o_rev = re.findall('(S+)', rev[-1])[-4]
            self.dick_read_list.insert(0, o_rev)
            self.dick_write_list.insert(0, i_rev)
    
            # 网络io情况
            i_net = 0
            o_net = 0
            nets = os.popen("sar -n DEV 1 1").readlines()
            for net in nets:
                if re.search('lo', net) or re.search('IFACE', net):
                    pass
                elif re.search('Average', net):
                    i_net += float(re.findall('(S+)', net)[-5])
                    o_net += float(re.findall('(S+)', net)[-4])
    
            self.net_read_list.insert(0, o_net)
            self.net_write_list.insert(0, i_net)
    
            # cpu使用情况
            cpu = os.popen("sar -u 1 1").readlines()
            cpu_use = 100 - float(re.findall('(S+)', cpu[-1])[-1])
            self.cpu_use_list.insert(0, cpu_use)
    
            # 内存使用情况
            mem = os.popen('LANG=en_US.UTF-8;sar -r 1 1').readlines()
            data = re.findall('(S+)', mem[-1])[3]
    
            self.mem_use_list.insert(0, data)
    
            # 时间信息
            t1 = datetime.datetime.now()
            now_time = t1.strftime("%Y-%m-%d %H:%M:%S")
            self.time_list.insert(0, now_time)
    
        def slice_list(self, target_list: list):
            if len(target_list) > 200:
                target_list = target_list[0:200]
            return target_list
    
        def check_list_length(self):
            self.slice_list(self.time_list)
            self.slice_list(self.dick_read_list)
            self.slice_list(self.dick_write_list)
            self.slice_list(self.net_read_list)
            self.slice_list(self.net_write_list)
            self.slice_list(self.cpu_use_list)
            self.slice_list(self.mem_use_list)
    
    
    if __name__ == '__main__':
        obj1 = ServerInfo()
        obj2 = ServerInfo()
        # print(obj1 is obj2)
        # thread_list = []
        # for i in range(10):
        #     obj1 = ServerInfo()
        #     t = threading.Thread(target=obj1.set_server_info)
        #     thread_list.append(t)
        #
        # t = None
        # for t in thread_list:
        #     time.sleep(1)
        #     t.start()
        # t.join()
        # obj2 = obj1 = ServerInfo()
        # print(obj2.get_server_info())
    
  • 相关阅读:
    spark streaming 概述
    spark sql 的性能调优
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
    LeetCode 90. Subsets II (子集合之二)
    LeetCode 88. Merge Sorted Array(合并有序数组)
    LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
    LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
    LeetCode 79. Word Search(单词搜索)
    LeetCode 78. Subsets(子集合)
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/14085368.html
Copyright © 2011-2022 走看看