在linux中使用python实现oracle进程的均衡负载

来源:互联网 发布:淘宝最新爆款方法 编辑:程序博客网 时间:2024/05/19 03:42



 在linux中使用python实现oracle进程的均衡负载

1、问题描述
一般Linux操作系统会对多CPU进行负载均横调度。但是有时因为应用系统的原因,
多CPU会表现不太均衡。目前的客户就遇到这样的情况,日常运行中16核的数据库
服务器第一核和第二核负载严重,其它比较空闲。

2、基本思路
针对此问题,直接的方式就是通过linux的taskset程序来对进程的均衡负载:
1)、先读取所有oracle的进程,
2)、根据进程的CPU使用率进行排序,
3)、将前16个进程随机分配到16个CPU。
具体实现选用python来实现。
Python 2.x 和 3.x 通常已经内置在现代 Linux 发行版中,你可以立刻使用它。
你可以终端模拟器中输入 python 或 python3 来进入 Python shell, 并输入
quit() 退出。

3、程序解析
1)、使用subprocess获取linux进程
   args = ['ps', 'aux']
   ps = subprocess.Popen(args, stdout=subprocess.PIPE)
2)、将进程进行排序
   dict1=sorted(PS.values(),key=lambda d:d['%cpu'],reverse=True) 
3)、将前16个进程随机分配到16个CPU。
   subprocess.call(["taskset","-pc",str(random.randint(0,15)),i['pid']])
  
4、程序执行方式
$ptyhon mgr-oracle.py

5、小结
此程序运行于客户的oracle数据库服务器,表现良好,实现了多CPU的负载均横。


参考文献
1、Getting Started with Python Programming and Scripting in Linux 作者: Gabriel Cánepa
https://www.tecmint.com/learn-python-programming-and-scripting-in-linux/
2、精通 Oracle+Python,第 8 部分:适合 Oracle DBA 使用的 Python作者:Przemyslaw Piotrowski
http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python-dba-1392286-zhs.html



附程序完整代码(文件名:mgr-oracle.py):

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#Licensed under the Apache License, Version 2.0
# Author Hua.Huang

# 50547681@qq.com
import re
import subprocess
import time
import random


while 1:
    args = ['ps', 'aux']
    ps = subprocess.Popen(args, stdout=subprocess.PIPE)
    processes = ps.stdout.readlines()
    header = re.split('\s+', processes.pop(0))[:-1]
    header.remove('COMMAND')

    PS = {}
    for process in processes:
        columns = re.split('\s+', process)
        if columns[0]!='oracle':
            continue
        PS[int(columns[1])] = {}
        for position, column in enumerate(columns[:9]):
            PS[int(columns[1])][header[position].lower()] = column
            PS[int(columns[1])]['command'] = ' '.join(columns[10:])

    dict1=sorted(PS.values(),key=lambda d:d['%cpu'],reverse=True)
    #pprint(dict1)
    a=0
    for i in dict1:
        print "pid:",i['pid']
        print "%cpu:",i['%cpu']
        subprocess.call(["taskset","-pc",str(random.randint(0,15)),i['pid']])
        if a==15:
            break
        a=a+1

    time.sleep(10)

原创粉丝点击