- [ backend/데이터베이스 ][mysql] 성능 최적화 3편 (데이터 크기)2024-02-13 15:36:22데이터 구조 최적화 테이블을 설계할 때 적절한 데이터 타입을 설정하는 것이 매우 중요하다. 최소한의 데이터 크기를 사용함으로써 테이블이 차지하는 디스크 공간을 최적화할 수 있고, 데이터가 메모리에 로드될 때 메모리 공간을 적게 사용하기 때문에 더 많은 데이터를 캐싱할 수 있다. 데이터 크기 최적화 데이터 크기를 최적화하면 디스크에 저장되는 데이터 양을 줄일 수 있다. 이는 저장소 비용을 절감하고 데이터 전송 시간을 단축시킨다. 테이블 컬럼 최적화 작은 크기의 데이터 타입을 사용하여 디스크 공간과 메모리를 확보한다. 가능한 `NOT NULL`로 선언하여 각 값이 null인지 테스트하는 오버헤드를 제거한다. `TINYINT` `SMALLINT` `MEDIUMINT` `INT` `BIGINT` 바이트 1 2 ..
- [ 학습기록/CS 공부 ][OS] 커널 (모드 비트/시스템 콜/인터럽트)2024-02-12 02:01:35커널은 운영체제의 핵심 프로그램으로, 시스템의 모든 것을 조율하고 제어한다. 커널은 운영체제 코드의 일부로서 메모리에 상주하며, 시스템 시작 시에 가장 먼저 로드된다. 커널의 주요 역할은 다음과 같다. 커널은 하드웨어 자원을 관리한다. 자원을 효율적으로 관리하여 여러 프로세스가 안정적으로 실행되도록 한다. 커널은 프로세스를 관리하여 다중 프로세스 환경에서 각 프로세스가 공정하게 자원을 사용하고 서로 간섭하지 않도록 중재한다. 커널은 프로세스들이 필요로 하는 메모리를 할당하고 해제한다. 커널 주소 공간 (os 상주 영역) 은 커널이 실행되는 메모리 영역을 의미한다. 이 영역은 시스템의 가장 상위에 위치하며, 보호된 메모리 영역에 할당된다. 사용자 프로세스들은 직접 이 영역에 접근할 수 없지만, 시스템 콜을..
- [ 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문은 데이터베이스를 조..