无法通过 python (Socket) 在一分钟内将大指标 (500+) 推送到 Graphite
Unable to push large metrics (500+) within a min to graphite via python (Socket)
我有 5 个 MySQL 个从机和 1 个主机,我正在为每台机器收集统计数据并使用 python 程序推送到 Graphite。该脚本运行 6 个线程(对于每台机器)并通过套接字发送到石墨。我很清楚,我无法一次推送超过 70 个统计数据。这是程序。
ThreadSocketClient.py
from threading import Thread, current_thread
import socket
import MySQLdb as Database
import logging
import sys
import time
from mysqlStats import status_keys
from mysqlStats import GRAPHITE_HOST, GRAPHITE_PORT
class MysqlGraphiteUtil(Thread):
def __init__(self,host,port,user,password):
Thread.__init__(self)
print current_thread
self.host=host
self.port=port
self.user=user
self.password=password
self.sock = socket.socket()
self.sock.connect((GRAPHITE_HOST, GRAPHITE_PORT))
def run(self):
self.connectDB()
self.showStatus()
self.sock.close()
def connectDB(self):
try:
self.db = Database.connect(
host=self.host,
port=self.port,
user=self.user,
passwd=self.password
)
except Exception, err:
logging.exception(err)
print err
sys.exit()
return self.db,self.host
def showStatus(self):
self.cursor = self.db.cursor()
self.cursor.execute("SHOW GLOBAL STATUS")
data = self.cursor.fetchall()
self.stats = dict()
for key, value in data:
if key in status_keys:
self.stats[key] = value
self.db.close()
self.push_data(self.stats, self.host)
def push_data(self,stats, sname):
for key, val in stats.iteritems():
if val.isdigit():
short = sname.replace('.', '_')
message = 'mysql.' + short + '.' + key + ' ' + val + ' ' + '%d \n' % int(time.time())
self.sock.send(message)
self.sock.close()
问题出在 push_data()
,当我将 time.sleep(0.30)
放在 self.sock.close()
之后时,它正在发送所有数据,但需要一分多钟(大约 2 分钟)。这是没有用的,因为我正在收集每分钟的指标。请帮助我如何加速套接字连接和发送。
PS:如果支持文件需要任何详细信息,请告诉我,我会post。
我用 tcpdump
验证了服务器是否正在消耗我发送的所有 packets/data。它按预期进行。所以,确认 socket
不是问题。
接下来的检查,我想完全验证carbon.conf
,发现MAX_QUEUE_SIZE
是500,增加到1000,但发送总数和接收总数仍然存在差异。
还发现 MAX_CREATES_PER_MINUTE=100
,我把它改成了 1000,成功了!!这是指示石墨创建最大编号的值。每分钟耳语文件数。
我有 5 个 MySQL 个从机和 1 个主机,我正在为每台机器收集统计数据并使用 python 程序推送到 Graphite。该脚本运行 6 个线程(对于每台机器)并通过套接字发送到石墨。我很清楚,我无法一次推送超过 70 个统计数据。这是程序。
ThreadSocketClient.py
from threading import Thread, current_thread
import socket
import MySQLdb as Database
import logging
import sys
import time
from mysqlStats import status_keys
from mysqlStats import GRAPHITE_HOST, GRAPHITE_PORT
class MysqlGraphiteUtil(Thread):
def __init__(self,host,port,user,password):
Thread.__init__(self)
print current_thread
self.host=host
self.port=port
self.user=user
self.password=password
self.sock = socket.socket()
self.sock.connect((GRAPHITE_HOST, GRAPHITE_PORT))
def run(self):
self.connectDB()
self.showStatus()
self.sock.close()
def connectDB(self):
try:
self.db = Database.connect(
host=self.host,
port=self.port,
user=self.user,
passwd=self.password
)
except Exception, err:
logging.exception(err)
print err
sys.exit()
return self.db,self.host
def showStatus(self):
self.cursor = self.db.cursor()
self.cursor.execute("SHOW GLOBAL STATUS")
data = self.cursor.fetchall()
self.stats = dict()
for key, value in data:
if key in status_keys:
self.stats[key] = value
self.db.close()
self.push_data(self.stats, self.host)
def push_data(self,stats, sname):
for key, val in stats.iteritems():
if val.isdigit():
short = sname.replace('.', '_')
message = 'mysql.' + short + '.' + key + ' ' + val + ' ' + '%d \n' % int(time.time())
self.sock.send(message)
self.sock.close()
问题出在 push_data()
,当我将 time.sleep(0.30)
放在 self.sock.close()
之后时,它正在发送所有数据,但需要一分多钟(大约 2 分钟)。这是没有用的,因为我正在收集每分钟的指标。请帮助我如何加速套接字连接和发送。
PS:如果支持文件需要任何详细信息,请告诉我,我会post。
我用 tcpdump
验证了服务器是否正在消耗我发送的所有 packets/data。它按预期进行。所以,确认 socket
不是问题。
接下来的检查,我想完全验证carbon.conf
,发现MAX_QUEUE_SIZE
是500,增加到1000,但发送总数和接收总数仍然存在差异。
还发现 MAX_CREATES_PER_MINUTE=100
,我把它改成了 1000,成功了!!这是指示石墨创建最大编号的值。每分钟耳语文件数。