상황 만들기

stress tool로 cpu로드 100프로 생성하기 

# CPU stress 테스트 툴 설치
sudo apt install -y stress

 

cgroup 속성 변경하기

cgroup과 같은 속성은 실제로 파일은 아니지만 디렉토리 형태로 해서 속성이 들어가있고 echo 로 값을 써가면서 설정들을 변경할 수 있습니다. 

 

test용 cgroup 생성

mkdir utils 로 만들고 해당 그룹에 들어가 보면 컨트롤 제어에 필요한 cpu와 관련된 각종 값들이 세팅 되어있습니다. 

 

cpu 사용량 10% 제한

해당 값을 10%로 제한하려면 cpu.cfs_quota_us 값과 cpu.cfs_period_us 값을 세팅하면 됩니다. 둘다 microsecond 단위.

자식 프로세스는 해당 컨트롤 그룹의 부모 컨트롤 그룹의 상속을 받기 때문에 다른 쉘로 이동하면 안됩니다. 

# cfs quota 설정
echo 10000 > cpu.cfs_quota_us

 

tasks 등록하기

echo $$ > tasks

 

stress 명령 실행하기

# stress test 실행
stress -c 1

cpu가 10%로 제한되었습니다.

 

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

'linux' 카테고리의 다른 글

[Linux] namespace  (0) 2023.01.17
[Linux] cgroup  (0) 2023.01.12

https://leetcode.com/problems/remove-all-occurrences-of-a-substring/

 

Remove All Occurrences of a Substring - LeetCode

Remove All Occurrences of a Substring - Given two strings s and part, perform the following operation on s until all occurrences of the substring part are removed: * Find the leftmost occurrence of the substring part and remove it from s. Return s after re

leetcode.com

 

풀이

StringBuilder 에 indexOf 메서드를 쓰면 part가 포함되어있는 idx를 알려준다. 없으면 -1 리턴.

 -1 이 나올때까지 (포함되어있지 않을때까지) 반복문을 돌리면서 포함되어있으면 delete 해준다.

 

 

public static String removeOccurrences(String s, String part) {
    StringBuilder sb = new StringBuilder(s);

    while (sb.indexOf(part) != -1) {
        sb.delete(sb.indexOf(part), sb.indexOf(part) + part.length());
    }
    return sb.toString();
}

 

https://leetcode.com/problems/compare-version-numbers/description/

 

Compare Version Numbers - LeetCode

Compare Version Numbers - Given two version numbers, version1 and version2, compare them. Version numbers consist of one or more revisions joined by a dot '.'. Each revision consists of digits and may contain leading zeros. Every revision contains at l

leetcode.com

버전2개를 비교하는 문제 

 

풀이

version 2개를 "." 를 기준으로 split하고

길이를 맞춰서 ArrayList에 넣어줬다. 모자른 부분은 0으로 채워둠.

ArrayList 두개 비교 

 
class Solution {
     public int compareVersion(String version1, String version2) {

        // . 을 기준으로 split
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        int maxLength = Math.max(v1.length, v2.length);

        // 0 을 채워 size 동일한 ArrayList 만들기
        List<String> arr1 = getArr(v1, maxLength);
        List<String> arr2 = getArr(v2, maxLength);

        // 크기 비교
        for (int i = 0; i < maxLength; i++) {
            if (Integer.parseInt(arr1.get(i)) > Integer.parseInt(arr2.get(i))) return 1;
            else if (Integer.parseInt(arr1.get(i)) < Integer.parseInt(arr2.get(i))) return -1;
        }

	// 버전이 동일하면 0
        return 0;

    }

    ArrayList<String> getArr(String[] str, int maxLength) {
        ArrayList<String> arr = new ArrayList<>(Arrays.asList(str));

        while (arr.size() != maxLength) {
            arr.add("0");
        }
        return arr;
    }
}

 

https://leetcode.com/problems/ransom-note/description/

 

Ransom Note - LeetCode

Ransom Note - Given two strings ransomNote and magazine, return true if ransomNote can be constructed by using the letters from magazine and false otherwise. Each letter in magazine can only be used once in ransomNote.   Example 1: Input: ransomNote = "a"

leetcode.com

 

문제

문제에서 2개의 문자열(ransomNote, magazine)이 주어진다.
magazine을 구성하는 문자를 이용하여 ransomNote와 동일한 문자열을 만들 수 있는냐가 문제의 핵심이다.
canConstruct("aab", "baa"); -> true

ransomNote and magazine consist of lowercase English letters.

소문자로만 이루어져서 길이 26의 int배열을 만들고 magazine의 개수를 넣어준다.

배열과 ransomNote를 비교하여 T/F 리턴

 

public static boolean canConstruct(String ransomNote, String magazine) {

    // 소문자 배열을 만들어서 magzine 넣는다.
    int[] mag = new int[26];
    for (char m : magazine.toCharArray()) {
        int idx = m - 97;
        mag[idx]++;
    }

    // ransomNote 돌려가면서 배열에 있는지 확인한다.
    for (char r : ransomNote.toCharArray()) {
        int idx = r - 97;
        if (mag[idx] == 0) return false;
        mag[idx]--;
    }

    // for문을 다 돌았으면 true 리턴한다.
    return true;
}

시간복잡도 : O(n)

 

cgroup

컨테이너를 구성하는 3가지 주요 리눅스 기술

  • Control groups (cgroups)
  • Namespaces
  • Union mount filesystem

 

cgroups (Control Groups)

  • cgroup은 프로세스들이 사용하는 시스템 자원의 사용정보를 수집및 제한 합니다. 제한을 하기 위해서 프로세스들 별로 사용하고 있는 리소스들의 정보를 수집하고, 수집된 정보를 기반으로 설정된만큼 제한을 진행합니다.
  • 제한 가능한 자원 : CPU, Memory, Network, Device, Block I/O
  • 활용 사례 : runc, YARN (Hadoop), Android 등
    • 컨테이너에서 사용되는 OCI 런타임인 runc가 있습니다.
    • 하드웨어 리소스를 관리하는 Yarn에서도 하드 작업을 내릴 때 작업에서 사용할 CPU와 메모리의 양들을 설정하게 되고 cgroup을 통해서 구현이 됩니다.
    • 안드로이드는 크게 Foreground와 Background 컨트롤로 구성이 되어 있습니다.
      • Foreground, Visible : 사용자가 원활하고 최대한의 성능을 쓸 수 있도록 하기 위해 Foreground용 컨트롤 그룹을 만들고 해당 그룹에 있는 작업들은 자원의 사용에 제한을 거의 받지 않습니다.
      • Background : 백그라운드로 돌고있는 작업들의 경우 네트워크가 스토리지와 리소스 사용에 있어 제한을 걸게 됩니다.
  • cgroups은 두가지 버전이 있습니다.
    • cgroupsv1 : 컨트롤하는 대상이 되는 리소스를 기준으로 개별적으로 cgroups을 생성합니다. 현재 대부분 v1 기반으로 사용되고 있습니다.
    • cgroupsv2 : 사용자가 쓰기 편하게 하는 목적이 있습니다.

 

 

cgroups 서브시스템

  • CPU : 스케줄러를 이용해 해당 cgroup에 속한 프로세스 cpu 사용 시간을 제어합니다. 프로세스의 사용시간을 정하는게 스케줄러이기 때문에 CFS 스케줄러를 쓰고 있는데, CFS 스케줄러 코드에 맞게 cgroup과 관련된 설정들이 들어가 있습니다.
  • memory : 해당 컨트롤 그룹에 속한 메모리의 사용량에 대해 제어합니다.
  • freezer : cgroup의 작업을 일시 중지하거나 다시 시작합니다.
  • blkio : cgroup에 블록 장치에 대한 입출력 제한을 설정합니다.
  • net_cls : 이 서브시스템은 Linux 트래픽 컨트롤러 (tc)가 특정 cgroup 작업에서 발생하는 패킷을 식별하게 하는 클래식 식별자 (classid)를 사용하여 네트워크 패킷에 태그를 지정합니다

 

 

https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/6/html/resource_management_guide/ch01

https://fastcampus.co.kr/dev_online_devopskit

 

DevOps 마스터 Kit with Linux, Kubernetes, Docker | 패스트캠퍼스

0부터 시작하는 DevOps의 모든 것! DevOps 엔지니어/SRE가 되기 위한 Linux 기초부터 Docker, Kubernetes의 활용과 이직을 위한 데브옵스 인터뷰 준비까지 이 강의 하나로 빠짐없이 학습해 보세요.

fastcampus.co.kr

 

 

'linux' 카테고리의 다른 글

[Linux] namespace  (0) 2023.01.17
[Linux] cgroup으로 CPU 사용 제한하기  (0) 2023.01.14

https://school.programmers.co.kr/learn/courses/30/lessons/131701

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

public class P131701 {
    /*
    {4,7,9,1,1} -> {4,7,9,1,1,4,7,9,1} 로 늘어뜨려서 계산
    set에 담아서 중복 제거
     */

    public int solution(int[] elements) {
        Set<Integer> set = new HashSet<>();
        List<Integer> arr = new ArrayList<>();
        for (int e : elements) {
            arr.add(e);
        }
        arr.addAll(arr);
        arr.remove(arr.size() - 1);

        for (int i = 0; i < elements.length; i++) {
            int sum = 0;
            for (int k = i; k < i + elements.length; k++) {
                sum += arr.get(k);
                set.add(sum);
            }
        }
        return set.size();
    }
}

도커에는 '이미지(Image)' 라는 개념이 있습니다. 이미지라고 사진같은 개념은 아닙니다.

도커에서 이미지는 컨테이너 실행에 필요한 모든 파일과 설정 값 등을 포함한 것으로 상태값을 가지지 않고 변하지 않는 것입니다.

  • 이미지는 특정 프로그램을 실행하기 위한 파일과 설정값을 지니고 있는 것.
  • 의존성 파일을 컴파일하거나 설치가 필요 없다.
  • 이미지를 다운로드 받고 실행하면 컨테이너를 실행 가능.

컨테이너 : 이미지를 실행한 상태

 

https://tech.ktcloud.com/73

가상머신 기반 가상화 기술

 

 

Virtual machines

  • 저수준 하드웨어장치(CPU, Disk, Network)를 가상화하는 기술
  • 하이퍼바이저 위에 하나의 머신들이 가상화돼서 동작한다.
  • 머신 단위로 할당이 되기 때문에 각각 OS도 설치해야 앱 구동 가능

장점

  • 다양한 운영체제 실행 가능
  • 물리머신 대비 동일한 자원을 더 효율적으로 사용
  • 물리머신 대비 빠른 서버 프로비저닝

단점

app을 구동하기 위해 굳이 OS가 다 올라와야 한다.

하이퍼바이저

  • 하이퍼바이저 = 가상머신 모니터 = VMM
  • 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼(platform)을 말한다.
  • CPU와 메모리 스토리지 등의 하드웨어 자원들을 애뮬레이션해서
    결과적으로 한 대의 서버에 독립된 여러 머신 환경을 구성하는것과 같은 가상화를 제공한다.

 

 

하이퍼바이저의 두가지 타입

 

하이퍼바이저의 두가지 타입

  • TYPE1 - 하드웨어에 하이퍼바이저가 설치되고 그 위에 Guest OS들이 설치가 된 구조 (서버, 워크스테이션 클라우드 환경에서 많이 사용)
  • TYPE2 - Host OS 위에 하이퍼바이저 위에 Guest OS들이 동작 (주로 데스크탑, 노트북 환경에서 많이 사용)

 

 

 

컨테이너 기반 가상화 기술

 

컨테이너

  • app구동에 필요한 모든 종속성을 포함한 sw패키지를 운영체제 위에서 가상화
  • 하드웨어 위에 Host OS 위에 컨테이너를 구동하기 위한 컨테이너 엔진( =도커) 위에 컨테이너
  • 컨테이너를 어느 환경에나 배포 가능하다.
  • OS를 부팅하거나 라이브러리를 로드할 필요가 없다.
  • 가상환경을 더 효율적이고 경량으로 생성 가능하다.
  • 수초 이내의 빠른 시작시간
  • 하나의 호스트에 더 많은 app 실행 가능
  • 운영적인 측면에서 보면 OS 업데이트나 패치등 Host를 공유하기 때문에 유지관리를 하는데 있어서 오버헤드가 감소한다.
  • 단점으로는 컨테이너가 정의된 운영체제의 종속성
  • ** 운영체제를 공유하고 커널을 공유하는 형태이기 때문에 안전하게 isolation을 했지만
    클라우드 vendors와 같이 다중고객 멀티 테넌트 환경에서는 리스크를 갖고 있는 구조이기 때문에 이를 개선하기 위한 다른 방식의 라이트웨이트 가상화를 구현해서 사용하기도 합니다.

+ Recent posts