123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /*
- Copyright 2016 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package framework
- import (
- "bufio"
- "fmt"
- "strings"
- e2elog "k8s.io/kubernetes/test/e2e/framework/log"
- e2essh "k8s.io/kubernetes/test/e2e/framework/ssh"
- )
- // KubemarkResourceUsage is a struct for tracking the resource usage of kubemark.
- type KubemarkResourceUsage struct {
- Name string
- MemoryWorkingSetInBytes uint64
- CPUUsageInCores float64
- }
- func getMasterUsageByPrefix(prefix string) (string, error) {
- sshResult, err := e2essh.SSH(fmt.Sprintf("ps ax -o %%cpu,rss,command | tail -n +2 | grep %v | sed 's/\\s+/ /g'", prefix), GetMasterHost()+":22", TestContext.Provider)
- if err != nil {
- return "", err
- }
- return sshResult.Stdout, nil
- }
- // GetKubemarkMasterComponentsResourceUsage returns the resource usage of kubemark which contains multiple combinations of cpu and memory usage for each pod name.
- // TODO: figure out how to move this to kubemark directory (need to factor test SSH out of e2e framework)
- func GetKubemarkMasterComponentsResourceUsage() map[string]*KubemarkResourceUsage {
- result := make(map[string]*KubemarkResourceUsage)
- // Get kubernetes component resource usage
- sshResult, err := getMasterUsageByPrefix("kube")
- if err != nil {
- e2elog.Logf("Error when trying to SSH to master machine. Skipping probe. %v", err)
- return nil
- }
- scanner := bufio.NewScanner(strings.NewReader(sshResult))
- for scanner.Scan() {
- var cpu float64
- var mem uint64
- var name string
- fmt.Sscanf(strings.TrimSpace(scanner.Text()), "%f %d /usr/local/bin/kube-%s", &cpu, &mem, &name)
- if name != "" {
- // Gatherer expects pod_name/container_name format
- fullName := name + "/" + name
- result[fullName] = &KubemarkResourceUsage{Name: fullName, MemoryWorkingSetInBytes: mem * 1024, CPUUsageInCores: cpu / 100}
- }
- }
- // Get etcd resource usage
- sshResult, err = getMasterUsageByPrefix("bin/etcd")
- if err != nil {
- e2elog.Logf("Error when trying to SSH to master machine. Skipping probe")
- return nil
- }
- scanner = bufio.NewScanner(strings.NewReader(sshResult))
- for scanner.Scan() {
- var cpu float64
- var mem uint64
- var etcdKind string
- fmt.Sscanf(strings.TrimSpace(scanner.Text()), "%f %d /bin/sh -c /usr/local/bin/etcd", &cpu, &mem)
- dataDirStart := strings.Index(scanner.Text(), "--data-dir")
- if dataDirStart < 0 {
- continue
- }
- fmt.Sscanf(scanner.Text()[dataDirStart:], "--data-dir=/var/%s", &etcdKind)
- if etcdKind != "" {
- // Gatherer expects pod_name/container_name format
- fullName := "etcd/" + etcdKind
- result[fullName] = &KubemarkResourceUsage{Name: fullName, MemoryWorkingSetInBytes: mem * 1024, CPUUsageInCores: cpu / 100}
- }
- }
- return result
- }
|