리눅스 커널 버전 4.4는, 우리의 환경에서 사용되는 cgroup에, cgroup에만큼 선택한 커널 구성을 지원하고 있으며, 구성 할 것을 확인합니다 (일반 설정 -> 대조군 지원 ->)
cgroup에에 온라인으로 다양한 정보가 있습니다, 그럴 게요 여기에없는 세부 사항, 직접 마운트 cgoup
MKDIR cgroup에
MKDIR cgroup에 / CPU의
MKDIR cgroup에 / 메모리
탑재 -t cgroup에 -ocpu cgroup에의 CPU / CPU
탑재 -t cgroup에 -omemory cgroup의 메모리 / 메모리> / 디바이스 / 2 UTIL> 1 &
MKDIR cgroup에 / CPU / cgroup0
1, 제한 CPU 사용률
실현과 cfs_period_us 및 cpu.cfs_quota_us으로 cfs_period_us 기본 값은 사이클 시간이 100ms를 대신하여,이 100ms이며, cpu.cfs_quota_us 점령이 100ms 내에 처리 할 수있는 최대 시간의 기간이 95ms로 설정 될 수있다, 즉, CPU 사용률은 95 %이다 이 하나의 CPU 사용률합니다, 멀티 코어 시스템을 위해, 당신은 cpu.cfs_quota_us이 * cfs_period_us * 95 % N해야 95 %의 활용도를 설정하려면, N 고양이 시저에 의해 CPU 코어의 수 / cpuinfo의보기이다 (CpuNum =`고양이 / proc 디렉토리 / cpuinfo의 | 그렙 이름 | 컷 -f2 -d : | UNIQ -c | AWK의 -F '') ''{$ 1 인쇄} '
#set가 CPU의 비율이 98 %의
cfs_quota_us = 'EXPR $으로의 CpuNum \ * $의 cfs_period_us \ * 98 / 100`가
에코 $ cfs_quota_us> /cgroup/cpu/cgroup0/cpu.cfs_quota_us
에코 $ rcSPid> /cgroup/cpu/cgroup0/cgroup.procs
실시간 환경이 프로세스를 실행하려면, 설정 cpu.rt_runtime_us을 cpu.rt_period_us의 필요성, cpu.rt_period_us 실시간 처리, 기본 1의 사이클 시간이, cpu.rt_runtime_us 시간 이내에 최대 시간, 실시간 프로세스가 필요, 기본값은 0이며,이 통지를하지 않았다 시작은, 우리의 환경에 구성을 cgroup에, 그것은 비정상적인 다시 시작하게됩니다 나중에 rt_runtime_us 것으로 판명 0; 커널이 950ms (고양이 / proc 디렉토리 / sys 인 / 커널 / sched_rt_runtime_us)의 기본 값으로 설정 될 수있다 또는 커널 구성 cgroup에에 다음 항목 sched_rt 제거. RT이 과정이 제한 cgroup에이되지 않습니다, 더 cpu.rt_runtime_us에게 cgroup0 디렉토리에서이 일을 즉 없습니다
이 과정을 제한 PID cgroup.procs에 가입 할 필요가있을 수 있습니다 전에 설정 한 CPU 사용률 후, 그래서 그냥 단지 PID의하도록 rcS에 시작하려는 때문에하도록 rcS에서 시작하는 과정에서 우리의 환경의 cgroup.procs에 가입, 그렙 -o |이어서 생성 된 자식 프로세스를 자동으로 (GET rcSPid PID = '추신 -o의 PID, 통신에 cgroup.procs에 추가 "[0-9] *하도록 rcS."| 그렙 -o [0-9] * `)
2, 제한 메모리 사용
일부 프로세스의 버그가 메모리 누수가 발생하지 않도록하려면 memory.limit_in_bytes 바이트에 사용할 수있는 모든 프로세스를 최대 메모리 cgroup0 그룹을 제한 사용할 수 있습니다 때문에하도록 rcS부터의 과정에서 우리의 환경을, 따라서에만 필요 하도록 rcS 만 pid는 cgroup.procs에 참여, 이후 생성 된 자식 프로세스가 자동으로 cgroup.procs에 추가됩니다 시작해야합니다. 내 환경이 memory.limit_in_bytes MemFree-200M로 설정 (200M 커널 사용 왼쪽 충분하다)
MemFree =`고양이 / proc 디렉토리 / meminfo 파일 | 그렙 'MemFree'| AWK -F '' ''{$ 2 인쇄} '
204800` - MemRatioKB =`expr에 $ MemFree
MemRatio =`EXPR의 $의 MemRatioKB \ * 1024` # 설정 메모리 비율을
cgroup에에서 mkdir / 메모리 / cgroup0>는 / dev / 폴더의 유틸리티 2> & 1 개
$ MemRatio이> 에코 /cgroup/memory/cgroup0/memory.limit_in_bytes
프로세스 메모리가 설정 한 임계치를 넘었을, 어떤 일이 일어날 것인가? 그것은 죽일 것입니다! ! 당신이 죽이고 싶어하지 않는 경우, 메모리 진행이 임계 값을 초과하는 경우, 프로세스가 그에게 할당 된 메모리까지 대기열에 추가 될 수 있도록, 1 memory.oom_control을 설정해야 할 것이다
#disable 킬 (kill)
에코 1> cgroup에 / 메모리 / cgroup0 / memory.oom_control
다른 메모리 디렉토리 항목 :
eventfd위한 cgroup.event_control # 1 인터페이스
memory.usage_in_bytes는 # 표시 메모리 현재 사용
memory.limit_in_bytes 번호 세트 / 메모리의 양의 전류 제한 표시
memory.failcnt # 디스플레이 메모리 사용하는 수의 한계 값에 도달
memory.max_usage_in_bytes # 과거 메모리 최대량
memory.soft_limit_in_bytes # 1 세트 / 현재 소프트 한계를 메모리의 양을 표시하는
현재 cgroup에의 미국인 표시 메모리 사용량 memory.stat
memory.use_hierarchy # 설정 / 표시 여부 내부 현재 서브 cgroup에 cgroup에 상기 메모리 사용량 통계
memory.force_empty # 시스템이 바로 현재 cgroup의 메모리를 복구 할 수 최대한 회수 트리거
와 cgroup.event_control 사용할 알림 이벤트 memory.pressure_level 번호 설정 메모리 압력
memory.swappiness 번호 설정 및 현재 swappiness 표시
프로세스가 이동할 때 memory.move_charge_at_immigrate # 1 세트 다른 cgroup에, 그것은 여부를 과거로 이동 메모리를 차지
memory.oom_control 번호 설정 / 표시 OOM 제어 구성 관련
# 디스플레이 NUMA 메모리 연관된 memory.numa_stat을
소비자가 CPU 사용률 및 메모리 소비 프로그램을 첨부, 또한 다른 사람을 참조하십시오.
. (1), CPU 사용량은 공정 변수의 수가 초월이다 (핵 프로세스는 CPU 소비)
INT의 main (int argc, 문자 *는 argv []) {
된 pid_t의 PID;
, I int로 PN = 4;
경우 (ARGC의 == 2) {
PN = atoi 함수 (는 argv [1]);
}
대 (I = 0; I는를 <PN; 내가 ++) {
PID = 포크 ();
만약 PID (<= 0) 체류;
}
의 경우 PID (<0) {
의 printf ( "포크 () 에러 가능 \ n");
-1을 리턴;
} (PID == 0)가 다른 경우 {
// 서브 프로세스는 동작
(;;)와;
} 다른 {
// 하위 프로세스의 종료를 기다릴
대기 (NULL);
}
0을 반환;
}
2 메모리 소비
#INCLUDE <STDIO.H>
#INCLUDE <stdlib.h>
사용법 #include <string.h>
사용법 #include <unistd.h>
MB를 #define한다 (1024 * 1024 * 1024)
INT의 main (int argc, 문자 *는 argv [])
{
숯 * P는;
int로 I = 0;
시스템 ( "고양이 /cgroup/cpu/cgroup0/cgroup.procs");
(1) {동안
p = (숯 *)의 malloc (MB);
memset 함수 (p, 0, MB);
의 printf ( "% DG 메모리 할당 \ n을"I ++);
슬립 (1);
}
0을 반환;
}