2015-05-16 10 views
18

डोकर एक इंटरैक्टिव आँकड़े आदेश, docker stats [cid] जो CPU उपयोग पर तारीख की जानकारी के लिए ऊपर देता है, तो जैसे प्रदान करता है:जाओ डोकर कंटेनर CPU उपयोग प्रतिशत के रूप में

CONTAINER  CPU %   MEM USAGE/LIMIT  MEM %  NET I/O 
36e8a65d  0.03%   4.086 MiB/7.798 GiB 0.05%  281.3 MiB/288.3 MiB 

मैं एक के रूप में CPU उपयोग पाने के लिए कोशिश कर रहा हूँ कुछ विश्लेषण करने के लिए एक पचाने योग्य प्रारूप में प्रतिशत।

मैं में आँकड़े/sys/FS जो Docker Remote API जो मुझे इस JSON ब्लॉब देता है के रूप में समान मान प्रदान करने लगते देखा है:

{ 
    "cpu_usage": { 
     "usage_in_usermode": 345230000000, 
     "total_usage": 430576697133, 
     "percpu_usage": [ 
      112999686856, 
      106377031910, 
      113291361597, 
      97908616770 
     ], 
     "usage_in_kernelmode": 80670000000 
    }, 
    "system_cpu_usage": 440576670000000, 
    "throttling_data": { 
     "throttled_time": 0, 
     "periods": 0, 
     "throttled_periods": 0 
    } 
} 

लेकिन मैं अनिश्चित कैसे एक सटीक CPU उपयोग पाने के लिए कर रहा हूँ उस से प्रतिशत के रूप में।

कोई विचार? -

+0

द्वारा उपयोग किए जाने वाले उदाहरण में आपका मूल्य नहीं है या क्या मुझे कुछ गलत मिल रहा है? –

+1

उसका मतलब था कि वह ** एपीआई ** से प्रतिशत कैसे प्राप्त कर सकता है, वैसे ही जैसे डॉकर क्लाइंट – luxas

उत्तर

24

आप आँकड़े API कॉल का उपयोग करने जा रहे हैं, तो आप कैसे डोकर ग्राहक यह करता है पर एक नज़र ले जा सकते हैं: https://github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go#L175-L188

func calculateCPUPercent(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 { 
    var (
     cpuPercent = 0.0 
     // calculate the change for the cpu usage of the container in between readings 
     cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(previousCPU) 
     // calculate the change for the entire system between readings 
     systemDelta = float64(v.CPUStats.SystemUsage) - float64(previousSystem) 
    ) 

    if systemDelta > 0.0 && cpuDelta > 0.0 { 
     cpuPercent = (cpuDelta/systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100.0 
    } 
    return cpuPercent 
} 

मूल रूप से, आप एक संदर्भ बिन्दु लेते हैं, तो में अंतर को देखने के 10 सेकेंड कहें, फिर आप बता सकते हैं कि कंटेनर द्वारा कितना समय इस्तेमाल किया गया था। कहें, हम कंटेनर के लिए 0 SystemCPUUsage और 0 CPUUsage से शुरू करते हैं। यदि 10 सेकंड के बाद, हमारे पास 10 SystemCPUUsage और 1 CPUUsage है, तो हमारे पास 10% उपयोग है। एपीआई में आपको केवल नैनोसेकंड में नतीजे नहीं दिए जाते हैं, सेकंड नहीं। वास्तविक समय कोई फर्क नहीं पड़ता, कुल SystemCPUUsage परिवर्तन महत्वपूर्ण है, फिर उस पर CPUUSage की तुलना करें। precpu_stats/cpu_stats

फिर, मूल रूप से यहाँ कोड है::

+1

लिंक से ऊपर प्रदर्शित होता है। इसे यहां मिला: https://github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go – darKoram

6

के बाद हम रिमोट एपीआई का उपभोग हम इन क्षेत्रों मिल (जावास्क्रिप्ट उदाहरण)

var res <---- remote api response 

var cpuDelta = res.cpu_stats.cpu_usage.total_usage - res.precpu_stats.cpu_usage.total_usage; 
var systemDelta = res.cpu_stats.system_cpu_usage - res.precpu_stats.system_cpu_usage; 
var RESULT_CPU_USAGE = cpuDelta/systemDelta * 100; 

बस RESULT_CPU_USAGE स्पष्ट करने के लिए ... यह आपके भौतिक हार्डवेयर से उपभोग संसाधन की मात्रा है, इसलिए आपको लगता है कि आपको RESULT_CPU_USAGE50% के रूप में, इसका अर्थ है कि आपकी सभी पीसी पावर का 50% कंटेनर एक्स

+0

आपकी गणना सीपीयू की संख्या को ध्यान में नहीं ले रही है। – smishra

+0

मुझे लगता है कि यह सीपीयू की संख्या से परिणाम गुणा करने के लिए ज्यादा समझ में नहीं आता है। मेरा मतलब है ... मेरी नोटबुक में 4 कोर हैं, अगर मैं इन कोरों को डॉकर कंटेनर से दबाता हूं और फिर बाहर से 'डॉकर आंकड़े' चलाता हूं ... मुझे ~ 400% सीपीयू उपयोग मिलता है। यदि मैं डॉकर होस्ट की निगरानी कर रहा हूं, तो मेरे पास 0% से 100% –

+0

की सीमा होगी, यह सीपीयू उपयोग प्रतिशत एक सेकंड प्रतीत होता है। इस एपीआई कॉल को 60 बार एक मिनट मारने के बिना एक मिनट के लिए कंटेनर द्वारा उपयोग किए जाने वाले औसत सीपीयू को पाने का कोई तरीका है? – getvivekv

संबंधित मुद्दे