ติดตั้ง cgconfig ใน Ubuntu 16.04


13

cgroupฉันต้องการที่จะสร้างกลุ่มควบคุมโดยใช้

จนถึงตอนนี้ฉันได้ทำสิ่งต่อไปนี้แล้ว:

  1. ฉันติดตั้งแพคเกจบางอย่าง:

    sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1
    
  2. จากนั้นฉันสร้าง/etc/cgconfig.confไฟล์โดยมีเนื้อหาดังต่อไปนี้:

    mount {
      cpuset  = /cgroup/cpuset;
      cpu     = /cgroup/cpu;
      cpuacct = /cgroup/cpuacct;
      memory  = /cgroup/memory;
      devices = /cgroup/devices;
      freezer = /cgroup/freezer;
      net_cls = /cgroup/net_cls;
      ns      = /cgroup/ns;
      blkio   = /cgroup/blkio;
    }
    
    group limitcpu{
      cpu {
        cpu.shares = 400;
      }
    }
    
    group limitmem{
      memory {
        memory.limit_in_bytes = 512m;
      }
    }
    
    group limitio{
      blkio {
        blkio.throttle.read_bps_device = "252:0         2097152";
      }
    }
    
    group browsers{
      cpu {
        cpu.shares = 200;
      }
      memory {
        memory.limit_in_bytes = 128m;
      }
    }
    

    ตามคำแนะนำที่นี่สมมติว่าไฟล์ config อยู่ในตำแหน่งเดียวกันและใช้ไวยากรณ์เดียวกันบน Ubuntu เนื่องจากใช้กับ CentOS

  3. cgconfig serviceจากนั้นตามที่คู่มือผมจำเป็นที่จะต้องเริ่มต้น ฉันลองด้วย:

    sudo service cgconfig restart
    

    แต่ไม่! ไฟล์หายไป!:

    Failed to restart cgconfig.service: Unit cgconfig.service not found.
    
  4. หลังจากที่สงสัยและค้นหาไปรอบ ๆ ฉันลอง:

    ● cgconfig.service
       Loaded: not-found (Reason: No such file or directory)
       Active: inactive (dead)
    

ดังนั้นฉันจึงไม่มีบริการ cgconfig ในระบบของฉัน!

ฉันค้นหาโดยใช้:

sudo aptitude search cgconfig

อย่างไรก็ตามไม่cgconfigพบ

ฉันจะติดตั้งcgconfigบน Ubuntu 16.04 ของฉันได้อย่างไร

คำตอบ:


15

ตกลงฉันจัดการตัวเองให้ทำเช่นเดียวกับคุณ แต่ด้วยการเปลี่ยนแปลงบางอย่าง:

1) ฉันติดตั้งสาธารณูปโภคเดียวกัน:

sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1

2) ฉันแก้ไขไฟล์ conf เช่นนี้:

/etc/init/cgroup-lite.conf

description "mount available cgroup filesystems"
author "Serge Hallyn <serge.hallyn@canonical.com>"

start on mounted MOUNTPOINT=/sys/fs/cgroup

pre-start script
test -x /bin/cgroups-mount || { stop; exit 0; }
test -d /sys/fs/cgroup || { stop; exit 0; }
/bin/cgroups-mount
cgconfigparser -l /etc/cgconfig.conf
end script

post-stop script
if [ -x /bin/cgroups-umount ]
then
    /bin/cgroups-umount
fi
end script

/etc/cgconfig.conf

# Since systemd is working well, this section may not be necessary.
# Uncomment if you need it
#
# mount {
# cpuacct = /cgroup/cpuacct;
# memory = /cgroup/memory;
# devices = /cgroup/devices;
# freezer = /cgroup/freezer;
# net_cls = /cgroup/net_cls;
# blkio = /cgroup/blkio;
# cpuset = /cgroup/cpuset;
# cpu = /cgroup/cpu;
# }

group limitcpu{
  cpu {
    cpu.shares = 400;
  }
}

group limitmem{
  memory {
    memory.limit_in_bytes = 512m;
  }
}

group limitio{
  blkio {
    blkio.throttle.read_bps_device = "252:0         2097152";
  }
}

group browsers {
    cpu {
#       Set the relative share of CPU resources equal to 25%
    cpu.shares = "256";
}
memory {
#       Allocate at most 512M of memory to tasks
        memory.limit_in_bytes = "512m";
#       Apply a soft limit of 512 MB to tasks
        memory.soft_limit_in_bytes = "384m";
    }
}

group media-players {
    cpu {
#       Set the relative share of CPU resources equal to 25%
        cpu.shares = "256";
    }
    memory {
#       Allocate at most 256M of memory to tasks
        memory.limit_in_bytes = "256m";
#       Apply a soft limit of 196 MB to tasks
        memory.soft_limit_in_bytes = "128m";
    }
}

cgconfigparser -l /etc/cgconfig.conf

และ /etc/cgrules.conf

user:process                                         subsystems   group
[user]:/usr/lib/chromium-browser/chromium-browser   cpu,memory      browsers
[user]:/usr/bin/clementine                        cpu,memory     media-players

นั่นคือตัวอย่างให้ใช้ชื่อผู้ใช้ของคุณแทน [ผู้ใช้] คุณสามารถเพิ่มแอปพลิเคชั่นที่คุณต้องการ จำกัด และกำหนดว่าคุณต้องการให้มันเป็น CPU-, หน่วยความจำ - หรือทั้งสองอย่างถูก จำกัด

ฉันแก้ไขGRUB_CMDLINE_LINUX_DEFAULTบรรทัดใน/etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"

อัปเดตมัน:

sudo update-grub

3) และในที่สุดการรีบูตเพื่อใช้การเปลี่ยนแปลง

และนั่นคือวิธีที่ฉันได้ทำงานนี้ ก่อนหน้านี้ฉันมี OOM บ่อยครั้งที่มีมัลติทาสก์ - ด้วยโครเมียมเบราว์เซอร์ clementine ข้อความประเสริฐและแอปพลิเคชันอื่น ๆ ที่ใช้ทรัพยากรจำนวนมาก - ตอนนี้พวกเขาทำงานได้อย่างราบรื่นและฉันสามารถทำงานหลายอย่างได้ดีขึ้น

ฉันหวังว่านี่จะช่วยคนอื่นได้

ปัจจุบันใช้Ubuntu 16.04 LTSกับIntel Dual Core 2.6 Ghzและ4 Gb แกะ.


1
สิ่งนี้ให้ความรู้สึกเหมือนแนวทางที่ถูกต้อง แต่แทนที่จะใช้ cgrules.conf ฉันพบว่า cgexec นั้นดีกว่า นอกจากนี้ผมคิดว่าคุณหมายถึงการตั้งชื่อไฟล์และไม่ได้cgconfig.conf cgconf.confหาก systemd ทำงานฉันไม่คิดว่าคุณต้องการmountส่วนในไฟล์นี้
ทำเครื่องหมาย

ฉันแก้ไขคำตอบนี้ตามคำแนะนำของมาร์คทดสอบและใช้งานได้ดี
Rdrk

@ Mark cgexecผมจะมีความสนใจในการแก้ปัญหาของคุณด้วย
Jonathan

9

ฉันประสบปัญหาเดียวกัน ดูเหมือนว่าไม่มีบริการในตัวในการแจกจ่าย Ubuntu ปัจจุบันเพื่อโหลดไฟล์ cgroup

คุณจะพบบางคน (เสีย?) ตัวอย่างสคริปต์ init ที่ / usr / share / doc / cgroup เครื่องมือ / ตัวอย่าง / cgconfigและ / usr / share / doc / cgroup เครื่องมือ / ตัวอย่าง / cgred

หากต้องการโหลดไฟล์กำหนดค่าด้วยตนเองคุณสามารถใช้

# Loads /etc/cgconfig.conf 
cgconfigparser -l /etc/cgconfig.conf

# Loads /etc/cgrules.conf
cgrulesengd -vvv --logfile=/var/log/cgrulesengd.log

ในฐานะที่เป็นวิธีการแก้ปัญหาของคนจนฉันจึงเขียนสคริปต์ init ที่โหลดทั้งสองไฟล์เมื่อเริ่มต้นระบบ

#!/bin/sh
### BEGIN INIT INFO
# Provides:          cgconf
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Configures CGroups
### END INIT INFO

start_service() {
  if is_running; then
    echo "cgrulesengd is running already!"
    return 1
  else
    echo "Processing /etc/cgconfig.conf..."
    cgconfigparser -l /etc/cgconfig.conf
    echo "Processing /etc/cgrules.conf..."
    cgrulesengd -vvv --logfile=/var/log/cgrulesengd.log
    return 0
  fi
}

stop_service() {
  if is_running; then
    echo "Stopping cgrulesengd..."
    pkill cgrulesengd
  else
    echo "cgrulesengd is not running!"
    return 1
  fi
}

status() {
  if pgrep cgrulesengd > /dev/null; then
    echo "cgrulesengd is running"
    return 0
  else
    echo "cgrulesengd is not running!"
    return 3
  fi
}

is_running() {
  status >/dev/null 2>&1
}

case "${1:-}" in
  start)
    start_service
    ;;
  stop)
    stop_service
    ;;
  status)
    status
    ;;
  *)
    echo "Usage: /etc/init.d/cgconf {start|stop|restart|status}"
    exit 2
    ;;
esac

exit $?

บันทึกไฟล์นี้ที่/etc/init.d/cgconfและติดตั้งโดยใช้

# make the script executable
chmod 755 /etc/init.d/cgconf

# register the service
update-rc.d cgconf defaults

# start the service
service cgconf start

# check the status
service cgconf status
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.