- [ backend/docker ][docker] GitHub Actions에서 도커 캐싱하기(cache from/cache to)2024-02-11 21:05:55CI/CD에서는 이미지 빌드 실행 시간을 최소화하는 것이 중요하다. 따라서 도커 파일을 작성할 때 각 레이어를 작은 단위로 분리하여 효율적으로 캐싱되도록 설계하는 것이 좋다. 하지만 깃헙 액션의 특성상 새로운 환경의 러너를 할당받게 되어 이전 빌드 내용이 남아있지 않아 캐시를 활용할 수 없었다. 도커에 대해 좀 더 공부하다보니 도커에서 캐싱할 수 있는 옵션이 있었다. 이미지 빌드 시에 `--cach-from` 및 `--cache-to`를 사용하여 캐싱을 관리할 수 있다. 지금부터 이러한 옵션을 활용하여 이미지 빌드 시간을 최적화해보자. 캐시 유형 `inline` - 빌드 캐시를 동일한 이미지에 내장하어 레지스트리에 푸시될 때 캐시도 함께 푸시한다. `registry` - 빌드 캐시를 별도의 이미지에 내장..
- [ 학습기록/CS 공부 ][OS] 가상 메모리 (페이지 부재/페이지 교체/스레싱/워킹셋)2024-02-09 21:04:57create the illustion to users of a very large (main) memory 가상 메모리는 실제 물리적인 메모리보다 큰 용량의 메모리 공간을 제공하는 기술이다. 프로그램이 필요로 하는 데이터를 일부만 물리적 메모리에 로드하고, 나머지는 디스크 공간에 저장한다. 그리고 프로그램이 해당 데이터에 접근할 때만 필요한 부분을 메모리로 옮겨 사용한다. 이를 통해 더 많은 프로그램을 실행할 수 있고, 메모리를 보다 효율적으로 사용할 수 있다. 가상 메모리는 주로 페이징 기법을 사용하여 메모리 용량을 초과하는 프로그램의 데이터를 디스크에 저장하고, 필요할 때마다 가져온다. 그러나 모든 페이지를 메모리에 동시에 유지할 수 없기 때문에 페이지 교체 알고리즘이 필요하다. 페이지 교체 알고리즘..
- [ 학습기록/CS 공부 ][OS] 메모리 관리 2편 (연속 할당/불연속 할당)2024-02-09 01:35:34메모리 관리 메모리 배치 메모리 배치는 시스템의 성능을 향상시키고 자원을 효율적으로 활용하는 데 중요한 역할을 한다. 올바른 메모리 배치는 프로세스 간의 메모리 접근을 최적화하여 프로그램 실행 속도를 향상시킨다. 이는 메모리의 인접한 위치에 있는 데이터 및 명령어에 빠르게 접근할 수 있게 함으로써 프로그램의 실행 효율성을 높인다. 또한, 메모리 공간을 효율적으로 활용하여 메모리 공간 낭비를 최소화한다. 이는 메모리 단편화*를 방지하여 더 많은 프로세스를 동시에 실행할 수 있도록 돕는다. *단편화 (fragmentation) : 메모리가 여러 조각으로 나누어져 메모리를 효율적으로 사용하지 못하는 상황 메모리는 크게 운영체제와 사용자 프로세스가 사용하는 영역으로 나뉜다. os 상주 영역은 운영체제 커널과 시..
- [ 학습기록/CS 공부 ][OS] 메모리 관리 1편 (주소 바인딩/메모리 로드)2024-02-07 23:35:36메모리는 프로그램이 실행될 때 필요한 데이터를 일시적으로 저장하는 공간이다. 운영체제는 이러한 메모리를 효율적으로 활용하여 다음과 같은 작업을 수행한다. 프로세스를 실행하기 위해 필요한 메모리를 할당하고 해제한다. 여러 프로세스가 동시에 실행될 때 메모리를 적절히 분배하여 각 프로세스가 충돌 없이 실행될 수 있도록 한다. 가상 메모리를 활용하여 물리적 메모리의 한계를 극복한다. 이를 통해 더 많은 프로세스를 동시에 실행할 수 있다. 메모리 관리 It determines how memory is allocated among competing processes, deciding which gets memory, when they receive it, and how much they are allowed. 메..
- [ backend/데이터베이스 ][mysql] 성능 최적화 2편 (트랜잭션)2024-02-06 20:39:51트랜잭션 최적화 트랜잭션은 데이터의 일관성과 안전성을 보장하는 핵심 요소다. 특히 다수의 데이터를 처리할 때 트랜잭션 범위를 어떻게 설정하느냐가 성능에 큰 영향을 미친다. 하지만 다수의 쿼리를 하나의 트랜잭션으로 처리하는 것이 반드시 성능 향상으로 이어질까? 한 트랜잭션에서 여러 쿼리를 처리하면 커밋이나 롤백이 발생하기 전까지 모든 변경사항이 보류된다. 그동안 다른 트랜잭션들이 해당 데이터에 접근하지 못하고 기다려야 하므로 트랜잭션의 처리 속도가 감소할 수 있다. 🚨 대량의 행을 삽입/수정/삭제한 후 롤백을 실행하는 것은 성능을 저하시킬 수 있다. 대규모 데이터 변경이 필요한 경우, 주기적으로 커밋을 실행하거나 작은 크기의 트랜잭션으로 나누는 것이 좋다. 한편, 각각의 쿼리를 개별적인 트랜잭션으로 처리하..
- [ backend/데이터베이스 ][mysql] 성능 최적화 1편 (인덱스/커버링 인덱스)2024-02-05 22:44:23데이터베이스 성능에는 테이블, 쿼리, 설정 등 다양한 수준의 요소들이 영향을 미친다. 최적화를 위해 소프트웨어, 하드웨어 수준에서 조절할 수 있지만 이 글에서는 하드웨어 최적화는 다루지 않을 것이다. 데이터베이스 최적화최적화 방법을 살펴보기 전에 아래 질문으로 어떤 점을 고려해야 하는지 간단히 알아보자.테이블은 올바른 데이터 유형의 열을 가지고 있고 적절한 수의 열을 갖추고 있는가인덱스가 적절히 구성되어 있는가각 테이블에 적합한 스토리지 엔진을 사용하고 해당 엔진의 강점과 기능을 활용하고 있는가디스크 낭비를 줄이고 I/O 시간을 단축하기 위해 압축된 테이블을 사용하고 있는가동시성을 위해 적절한 락 전략을 사용하고 있는가메모리 캐싱 영역을 올바른 크기로 설정했는가 SQL문 최적화sql문은 데이터베이스를 조..
- [ 학습기록/CS 공부 ][DB] 트랜잭션 (ACID/격리 수준)2024-02-05 03:09:44트랜잭션이란? 트랜잭션은 작업의 단위를 의미한다. 트랜잭션은 일관적이어야 하며 다른 트랜잭션에 고립적이어야 한다. 시스템 장애가 발생해도 올바르게 복구하여 데이터베이스의 일관성을 유지해야 한다. 데이터베이스에 동시에 접근하는 프로그램들을 격리시켜야 한다. 트랜잭션은 논리적인 작업의 단위로, 다수의 연산(쿼리)으로 구성될 수 있다. ACID 트랜잭션은 완전히 반영되거나 아예 반영되지 않아야 하고 (원자성) 기존 제약조건을 변경하지 않아야 하며 (일관성) 다른 트랜잭션에 영향을 미치지 않아야 한다. (고립성) 그리고 한 번 변경된 사항은 영구적으로 유지되어야 한다. (지속성) ACID 속성을 보장하기 위해서는 강력한 로깅 시스템이 트랜잭션을 적절하게 처리할 수 있어야 한다. atomicity 트랜잭션 내의 ..
- [ 학습기록/CS 공부 ][DB] 인덱스 (clustered/secondary)2024-02-04 03:14:49clustered Index (primary)클러스터형 인덱스는 데이터베이스를 정렬하여 인덱스의 순서와 일치하도록 만든다. 물리적인 저장 순서를 변경하기 때문에 하나의 테이블에는 하나의 클러스터형 인덱스만 존재할 수 있다.⭐ 클러스터형 인덱스는 물리적인 레코드 순서를 정렬한다!InnoDB에서 클러스터형 인덱스는 기본키를 의미한다. InnoDB는 기본키를 기준으로 테이블을 정렬하여 쿼리 속도를 향상시키는데, 이는 클러스터형 인덱스를 변경하는 데 비용이 많이 들기 때문이다.🚨 클러스터형 인덱스는 테이블을 정렬하기 때문에 자주 수정되는 값을 클러스터형 인덱스로 설정하면 테이블이 계속 정렬된다. secondary Index (non-clustered)보조 인덱스는 비클러스터형 인덱스다. 클러스터형 인덱스와 달리..