摘要:大綱我們需要監控兩臺服務器來確保它們是正常的,運行期間沒有內存和磁盤使用率問題。連接,在收到每個請求服務器的數據后,給每個對應的服務器響應格式化的數據。
注:原文地址 psutil and MongoDB for System Monitoring
這篇入門文章描述了怎樣創建一系列的圖表來監控一臺或多臺服務器的負載。使用 Python(psutil 和 bottle),MongoDB 和 jquery。不管你使用什么樣的數據庫或 WEB 框架,思路都是一樣的。
在最后,你將有一個 web 頁面為每臺服務器展示圖表,圖表中顯示了 cpu, memory, 和 disk usage。
大綱Part 0: Get the Tools
Part 1: Get the Data
About the MongoDB Collection.
The Data Gathering Code
Part 2: Set up the bottle Server
Part 3: Display the Data with jqplot
The HTML Page
The JavaScript (jqplot) Code
我們需要監控兩臺 FreeBSD 服務器來確保它們是正常的,運行期間沒有內存和磁盤使用率問題。 為了這篇文章的目的,這兩臺服務器的名字是 example01 和 example02。
注意:這些恰好是相同的機器運行 MongoDB 副本集,它們中的一臺運行 web 服務。沒有理由它們必須是相同的機器 - 你完全可以讓 MongoDB 運行在一臺不同的服務器上,而不是你想監控的其中一臺。這對于 web 服務也是一樣的 - 可以在任何服務器上,不是必須得在你監控的其中一臺服務器上。
我不想登錄每臺服務器,然后運行 top 或 ds 來找出發生了什么。我想要一個有最新圖表的 web 頁面可以看一眼,每臺服務器一個頁面。
整個工作流遵循以下三個步驟:
獲取系統數據存入 MongoDB(使用 psutil 和 cron)
設置一個 Web 服務器來查詢 MongoDB 的數據(使用 bottle)
編寫一個簡單的 Web 頁面來展示這些數據(jqplot + AJAX)
你可以在 GitHub 工程 psmonitor 上獲取所有的代碼。在這篇文章中,我使用一些代碼片段。
在第一部分,你在一個 cron 任務中使用 psutil Python 包每五分鐘寫系統信息到 MongoDB 的一個 capped collection 中。這 5 分鐘是完全任意的 - 你可以選擇你喜歡的任意時段。我正在監控的系統,幾分鐘提供足夠細的粒度。這部分把數據存入 MongoDB。
在第二部分, bottle 應用程序發出一個請求給 MongoDB,然后得到一個 JSON 數據格式的響應。這是在客戶端的 HTML 頁面和 MongoDB 數據直接創建了一個代理。
在第三部分,你有一個 HTML 文件匹配到你想監控的每臺服務器上。該文件加載 jqplot 并發出一個 AJAX 請求給 bottle 應用程序。這部分是波動的原因 - 我們獲取存儲在 MongoDB 中的負載數據的時間序列圖表。
這個我們創建的其中一個圖表的示例:
你可以為你想要的任何數據創建圖表。我為每臺機器使用的圖表是:
cpu user percent
cpu system percent
cpu irq
cpu nice percent
disk space free
memory free
Part 0: Get the Tools以下的工具需要通過安裝來實現,但是你可以使用一個不同的數據庫或是 Web 框架,如果你已經有的話。
psutil 是一個非常好用的跨平臺的系統監控工具,如果想了解更多,請移步至其項目主頁,你可以通過 pip 安裝它。
NoSQL 數據庫 MongoDB 是一個開源的文檔型數據庫。如果你有自然適合 JSON 結構的數據,MongoDB 會是一款非常適合存儲數據的工具。對我來說,它已經成為了首選的工具,當我隨時發現需要存儲 JSON 格式數據的時候。有趣的是,我越使用它,越能找到新的用途。MongoDB 的文檔型結構是驚人的有用,并且可以為許多信息類型提供 map 。
bottle Web 框架是一個用 Python 寫的沒有任何依賴的小型框架。你可以通過 pip 安裝它。你可以使用包括開發服務器讓事情繼續,稍后把它放在一個不同的后端服務器。我把我的放在 Apache 服務器,一旦我得到我希望他們的。我稍后將寫一篇文章關于這個的設置。
jqplot jquery 插件使得生產圖表更容易,加上它們看起來也不錯,并且它們是統一的很容易的比較圖表。比如,當一個進程波動起來的時候,在圖表中很容易看出來,因為你可以同時看到 cpu 和 內存飆升,這兩個圖表是同樣的 X 軸位置。你可以使用這個插件做很多事情,這個練習僅僅只是皮毛。
Part 1: Get the Data當我們想遵循這樣的模式創建一個數據結構的時候,在這步中你可以添加和刪除任何 psutil 支持的數據。終點是會看 jqplot 圖表的用戶,因此在你的腦海里保持數據結構,jqplot 想要的是一個雙元素列表的列表,其中一個是時間,像這樣:
[[datetime1, y-value1], [datetime2, y-value2], and so on.]
那個結構不是收集數據的最有效方式,但是記住你的初心是什么一直是很重要的。我們將收集數據并且改變數據結構以便給 jqplot 需要的數據結構。
當第一步我不知道我需要什么和使用什么,我有更多一些測量。我認為,隨著時間的流逝,我看到機器的實際需求將改變,并且它非常容易改變。
{ "server": servername, "datetime": datetime.now(), "disk_root": , "phymem":, "cpu": {"user":, "nice":, "system":, "idle":, "irq":,}, }
下面是 python 代碼從系統獲取數據(使用 psutil )到 MongoDB 數據庫。我在 MongoDB 中為每個被檢測到的機器創建了一個集合。
你可以在 MongoDB 中創建一個多帶帶的 document,包含了每臺機器的數據;這個依賴于你的需求。因為我想每臺機器有一個多帶帶的頁面,我用同樣的方式拆分數據。如果你想把所有機器的圖表渲染到一個頁面中的話,你或許想讓所有機器的數據在一個 document 中。
About the MongoDB Collection我有一個三個成員的 MongoDB 副本,設置名為 rs1。保存數據的機器恰巧是我監控的服務器,example01 和 example02。這第三個是一個仲裁者,不保存數據。這些 mongoDB 服務器不需要監控,它們可以在任何地方。
我有一個數據庫 reports,我們將把新的 collections 放入這個數據庫。對于每臺機器,我將有一個 collection 來包含它的負載數據:1440 分每天,每 5 分組抽樣一次,并保存 2 天的數據,我們需要 576 條記錄(documents)。
(1440/5)*2 = 576 records per server
我不確定我最后要使用多少數據,因此我預估了 2k 每個 document,我為每個 document 預估一個比較大的大小, 因為這僅僅是個開始,后面我需要收集更多的數據,結果是 2k 真的是非常慷慨了,每個記錄的平均大小是 200 bytes 左右,但是我沒有包含任何的網絡數據(并且 disk space 是低耗的)。
576 documents @ 2048 bytes per doc = 1,179,648 bytes
對于每一臺機器需要監控的機器,我創建了一個固定集合的最大大小上限 1179648 和一個最大的數量上限 576 documents:
use reports db.createCollection("example01", {capped:true, size:1179648, max:576}) db.createCollection("example02", {capped:true, size:1179648, max:576})
通過使用一個固定集合,我們將保證數據是以插入順序保存的,隨著時間流逝,老的 documents 會自動刪除,因此我們始終有最新的 48 小時數據。
The Data Gathering Code首先,做必須的 imports 并且連接到 MongoDB 實例:
from datetime import datetime import psutil import pymongo import socket conn = pymongo.MongoReplicaSetClient( "example01.com, example02.com", replicaSet="rs1", ) db = conn.reports
現在為你想要的每一個數據調用 psutil:
def main(): cpu = psutil.cpu_times_percent() disk_root = psutil.disk_usage("/") phymem = psutil.phymem_usage()
創建一個字典包含你需要的時間序列結構數據。
doc = dict() doc["server"] = socket.gethostname() doc["date"] = datetime.now() doc["disk_root"] = disk_root.free, doc["phymem"] = phymem.free doc["cpu"] = { "user": cpu.user, "nice": cpu.nice, "system": cpu.system, "idle": cpu.idle, "irq": cpu.irq }
最后,把這個字典作為一個 document 添加進匹配的 MongoDB 集合中。它將被轉換成一個 BSON document 當它被插入數據庫的時候,但是結構是一樣的。
if doc["server"] == "example01.com": db.example01.insert(doc) elif doc["server"] == "example02": db.example02.insert(doc)
這里你有代碼來獲取數據并且存儲進數據庫集合中。所有剩下的部分是運行代碼自動完成的。
在你想監控的每臺服務器上設置一個定時任務,每 5 分鐘運行一次:
*/5 * * * * /path/to/psutil_script
每個 MongoDB 集合包含 48 小時的系統性能數據,隨你操弄。
Part 2: Set up the bottle Server創建一個 bottle 應用程序來查詢 MongoDB集合。
連接 MongoDB,在收到每個請求服務器的數據后,給每個對應的服務器響應格式化的數據。
from bottle import Bottle import pymongo load = Bottle() conn = pymongo.MongoReplicaSetClient( "example01.com, example02.com", replicaSet="rs1", ) db = conn.reports
這是一個路由,一個 url 連接。當一個請求進來,從 url 中獲取服務器的名字,然后創建并返回一個合適的數據結構(jqplot 需要的)。
@load.get("/Part 3: Display the Data with jqplot") def get_loaddata(server): data_cursor = list() if server == "example02": data_cursor = db.example02.find() elif server == "example01": data_cursor = db.example01.find() disk_root_free = list() phymem_free = list() cpu_user = list() cpu_nice = list() cpu_system = list() cpu_idle = list() cpu_irq = list() for data in data_cursor: date = data["date"] disk_root_free.append([date, data["disk_root"]) phymem_free.append([date, data["phymem"]) cpu_user.append([date, data["cpu"]["user"]]) cpu_nice.append([date, data["cpu"]["nice"]]) cpu_system.append([date, data["cpu"]["system"]]) cpu_idle.append([date, data["cpu"]["idle"]]) cpu_irq.append([date, data["cpu"]["irq"]]) return { "disk_root_free": disk_root_free, "phymem_free": phymem_free "cpu_user": cpu_user, "cpu_irq": cpu_irq, "cpu_system": cpu_system, "cpu_nice": cpu_nice, "cpu_idle": cpu_idle, }
HTML Page
HTML 頁是非常簡單的。
在樣式表中讀取.
編寫一個 div 保存每個圖表。這以下的示例中我僅僅展示了 cpu_user 數據。該模式對于其他變量是一樣的。
加載 javascript。
你可以把 javascript 從 psmonitor.js 中直接放入頁面,或者是以一個文件的形式調用它(如示例那樣):
The JavaScript (jqplot) CodeLoad Monitoring
完整的代碼在 GitHub 工程中,但是這有 jqplot 代碼片段用來設置顯示數據。機器 example01 運行的 web 服務器將返回 json 格式的負載數據。同樣,web 服務器可以運行在任何機器上,在我的示例中,它發生在被我們監控的服務器中的一臺。
每個 plot 的代碼遵循了相同的模式:
發起一個 AJAX 請求調用運行著 bottle 應用的服務器。
把你想圖表化的數據放入一個變量。
把這個變量傳遞給 jqplot。
代碼中的 url 包含了 example01 字符串:
url: "http://example01/load/example01"
example01 的第一個實例是 web 服務器的地址,因為該機器上運行著 bottle 應用。第二個實例是我們想要數據的這臺服務器的名字。服務器名字(
$(document).ready(function(){ var jsonData = $.ajax({ async: false, url: "http://example01/load/example01", dataType:"json" }); var cpu_user = [jsonData.responseJSON["cpu_user"]]; $.jqplot("cpu_user", cpu_user, { title: "CPU User Percent: EXAMPLE01", highlighter: {show: true, sizeAdjust: 7.5}, cursor: {show: false}, axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer, tickOptions:{formatString:"%a %H:%M"}}}, series:[{lineWidth:1, showMarker: false}] }); });
該 javascript 劃分 CPU 用戶百分比;你可以用相同的方式添加另外的 plots,僅僅需要改變變量的名字和標題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18727.html
摘要:大綱我們需要監控兩臺服務器來確保它們是正常的,運行期間沒有內存和磁盤使用率問題。連接,在收到每個請求服務器的數據后,給每個對應的服務器響應格式化的數據。 注:原文地址 psutil and MongoDB for System Monitoring 這篇入門文章描述了怎樣創建一系列的圖表來監控一臺或多臺服務器的負載。使用 Python(psutil 和 bottle),Mon...
摘要:簡介是一個跨平臺庫,能夠輕松實現獲取系統運行的進程和系統利用率包括內存磁盤網絡等信息。它主要應用于系統監控,分析和限制系統資源及進程的管理。它實現了同等命令行工具提供的功能,如等。 psutil簡介 psutil是一個跨平臺庫(http://code.google.com/p/psutil/),能夠輕松實現獲取系統運行的進程和系統利用率(包括CPU、內存、磁盤、網絡等)信息。它主...
應用電腦工作時,有時不清楚什么軟件或過程會占有許多資源,造成開展別的任務后發生減緩、卡屏的現象。因而,智能監控系統資源就會變得至關重要。文中用Python撰寫了一臺超治好的RunCat監控應用系統軟件,所需要的可以了解一下 引言 大家好!我就是木木子,近來好懶了哈太熱了.jpg 有空來給大家升級一下啦!今天發布——跟這本文寫姊妹篇哈~ 應用Mac電腦工作時,有時不清楚什么軟件或過程會占...
摘要:通過這個平臺,可以替你提供諸如配置檢查和優化監控報警等功能。首先,它的是獨立于運行的,這意味著獲取各項指標的能力會受到限制。其次,這個需要跟平臺通訊。總而言之,只是將現存的監控方式炒冷飯而已。所以我大可放心抬杠,無需擔心影響別人家的生意。 對于 Nginx Amplify 不了解的同學,可以搜索一下,在 Nginx 官網上有介紹。簡單來說,就是你可以在服務器上安裝一個開源的 Pytho...
摘要:如果使用過,如果有一顆的心的話,一定會覺得不但酷炫而且十分實用。不過如果想觀察一個程序從運行開始到結束的占用率怎么辦好辦,利用的異步觀察就行。 showImg(https://segmentfault.com/img/remote/1460000018718651?w=1456&h=426); 如果使用過glances,如果有一顆geek的心的話,一定會覺得不但酷炫而且十分實用。不過如...
閱讀 2648·2021-11-24 09:39
閱讀 1648·2021-11-24 09:38
閱讀 629·2021-11-22 14:44
閱讀 1888·2021-11-18 10:02
閱讀 2573·2021-11-18 10:02
閱讀 1158·2021-10-14 09:43
閱讀 4244·2021-09-29 09:35
閱讀 524·2021-07-30 15:30