Category: HowTo

Ubuntu APT Could not get lock /var/lib/dpkg/lock 문제

우분투(Ubuntu) 를 부팅하고 난 후에 로그인을 하면 몇개의 새로운 업데이트가 있는지를 알려준다. 그래서 새로운 패키지 설치를 위해서 ‘apt upgrade’ 명령을 하게 되면 다음과 같은 오류 메시지를 만나곤 한다.

패키지를 설치하는 명령어인 dpkg 명령어가 이미 실행중인 것으로 인해서 실행이 안된다는 것이다. 실행을 할때에 lock 파일을 생성하게 되는데, 이를 근거로 혹시 다른 것이 이미 실행되고 있는건 아닌지 추측하고 있다.

도대체 무슨 일이 벌어지고 있는 걸까? 다른 것이 이미 실행중일지도 모르니까 다음과 같이 프로세스를 체크해 본다.

보아하니 apt.systemd.daily 이것이 apt 명령어를 실행하고 그래서 dpkg 가 이미 실행되고 있는 것으로 보인다.

이것은 아마도 부팅과 동시에 패키지를 업데이트 해주는일을 하는 녀석인 것으로 보이는데, 자동으로 패키지를 업데이트를 해준다니 얼마나 고맙겠냐만은 때로는 어떤 것이 설치되는지를 직접 선택하거나 해야하는 경우에는 자동으로 알아서 해주는것이 큰 위험이 될 수도 있다.

이것을 멈추게 하는 방법이 있다.

이렇게하면 부팅하면서 자동으로 apt 업데이트를 하는 건 막을 수 있다.

참고,

만일 부팅과장에서 각 서비스별 소비된 시간을 알고 싶다면 다음과 같이 확인해 볼 수 있다.

이렇게 보면 userspace 로 인한 시간이 1분이 넘어간다. 좀 더 자세하게 보기 위해서는 다음과 같이 확인해 볼수 있다.

Ubuntu18.04 호스트네임 영구 변경 설정

Ubuntu18.04 에서 호스트네임을 변경하기 위해서는 다음과 같이 해준다.

이렇게 한 후에 리부팅을 하면 원래 변경전 호스트네임이 나온다. 이럴때 /etc/cloud/cloud.cfg 파일에서 다음과 같이 변경을 해주면 된다.

이렇게 바꾼후에 다음과 같이 로그인 서비스를 재시작 해준다.

UBUNTU 18.04 KVM 게스트에 콘솔 접속하기

KVM 가상화를 사용하고 있고 게스트로 Ubuntu18.04 를 사용하고 있다면 콘솔 접속을 위해서는 다음과 같이 해주어야 한다.

/etc/default/grub 편집

grub 에서 ttyS0 에 콘솔 접속이 되도록 다음과 같이 편집해 준다.

위와같이 편집을 한 후에 grub 을 다시 작성해준다.

위와같이 설정을 하고 재부팅을 한 후에 KVM 콘솔 접속을 하면 아주 잘 된다.

Bash 파일 존재 유무 체크하기

Bash 쉘 스크립트를 작성할때 자주 사용하는 로직인 바로 파일 존재 유무를 체크하는 것이다. 파일 하나만 체크할 수도 있고 여러파일을 체크할 수도 있다. 여러 파일을 체크할때는 다음과 같이 할 것이다.

이것을 Bash 쉘 스크립트에서는 어떻게 리턴을 받아야 하나하는 고민이 생긴다. 가장 쉬운 방법은 stdout, stderror 를 체크하는 방법이다.

Bash 에서 이를 exit code 라고 하고 $? 에 세팅이되어 다음과 같은 로직이 가능해진다.

명령어가 성공(stdout)하면 $?에 0, stderr 면 1 이다. 위를 실행하면 다음과 같다.

위 방법외에도 한줄로 다음과 같이 할 수도 있다.

AND 와 OR 연산자를 이용해서 메시지를 출력하도록 한다.

하지만 위 방법도 오류 메시지, 혹은 결과가 출력이 되는데 이를 방지하고 결과만 받고 싶다면 다음과 같이 할 수 있다.

이렇게 하면 결과 출력 없이 yes, no 만 출력이 된다.

출처: How to check if a file exists in a shell script

Database 를 위한 공유 메모리, HugePages 계산하기

Database 시스템은 공유메모리 혹은 HugePages 에 매우 의존적입니다. 서버에서 데이터베이스가 가동되면 Database 가 사용하는 메모리는 Database만을 위해서 사용되어 집니다. 대부분의 큰 Database 시스템은 다른 서버 프로그램 없이 단독으로 설치되어 운영되어지기 때문에 얼마만큼 물리적 메모리를 Database 에 할당할지가 Database 시스템 전체에 큰 영향을 미칩니다.

이 글에서 Database 시스템을 위한 공유메모리, HugePages 등을 할당할때에 고려사항은 무엇이며 얼마나 할당하는 것이 좋은지를 살펴보겠습니다.

Oracle 11g or 12c

먼저 Oracle 은 물리적 메모리에 약 80% 를 Oracle 이 사용하도록 할당하도록 합니다. 여기서 대략 80% 라고 했는데, 만일 몇가지 프로그램을 함께 돌린다면 약 75% 가 적당합니다.

물리 메모리의 약 80% 할당

여기서 고려해야할 사항이 하나 있습니다. 80%를 할당하라고 해서 무조건 80%를 할당하게 되면 문제가 됩니다. 예를들어 16GB 의 물리 메모리로 운영하는 경우에 80%면 12.8GB 이고 서버에서 사용가능한 용량은 3.2GB 입니다. 요새 데스크탑 컴퓨터도 안되도 4GB 는 사용하는데 아무리 가벼운(?) 리눅스 서버라도 3.2GB 는 운영하는데 너무 적어 보입니다.

이럴때는 운영체제에서 사용할 최소 메모리를 남겨두고 나머지를 Oracle 에 할당하는게 현명하다고 할 수 있습니다.

또하나 중요하게 고려해야할 사항은 Oracle 에서 AMM을 쓰느냐 안쓰느냐 하는 문제 입니다. 이 둘의 차이는 다음과 같습니다.

AMM 을 사용할 경우: /dev/shm 장치를 이용한 공유메모리 모델 사용. HugePages 사용 불가

AMM을 사용하지 않을 경우: System V 공유 메모리 모델 사용. HugePages 사용 가능

 

Oracle 11g 버전으로 넘어오면서 전에 없던 기능이 하나 생겼는데, 그것은 바로 AMM(Aotomactic Memory Management) 입니다. AMM은 Oracle의 메모리 모델인 SGA와 PGA 를 통틀어서 메모리 관리를 자동으로 해준다는 개념입니다.

AMM 기능을 이용하면 대략적으로 SGA 영역은 Oracle 할당받은 메모리 영역에서 85%, PGA 는 약 15%로 나눠서 관리한다고 합니다.

또 한가지 AMM의 특징이 있는데, 공유메모리 모델중에서 /dev/shm 장치를 이용한 Posix 규격의 공유메모리 모델을 사용한다고 합니다. 이 메모리 모델은 메모리 가상 장치를 통해서 프로세스가 공유할 내용을 파일로 저장해서 공유하는 방법으로 오로지 용량에만 제약사항이 있습니다. 공유할 내용을 파일로 생성할때에 얼마만한 크기로 생성할지는 전적으로 서버 프로그램, 여기서는 Oracle, 에 의해서 결정됩니다. 최근의 모든 리눅스 서버는 /dev/shm 이 자동으로 마운트되어 있으며 기본적으로 전체 물리메모리의 50%를 사용합니다.

용량을 바꾸기 위해서는 다음과 같이 해줍니다. CentOS 6과 CentOS 7 배포판 별로 차이가 조금 있습니다.

 

만일 AMM을 사용하지 않을 경우에는 SystemV 의 공유메모리 설정을 따르게 됩니다. 이때에 HugePages 도 함께 사용할 수 있습니다. 이 설정들은 커널 파라메터로 조정하며 그 설정 변수는 다음과 같습니다.

shmmax: 단일 프로세스가 공유메모리를 호출하기 위한 최대 값. 단위 Bytes

shmall: 시스템을 통틀어 사용가능한 공유 메모리 Page 량. 단위 Page

nr_hugepages: Huge 페이지 개수.

 

여기서 중요한 것이 만일 HugePages 를 사용한다면 shmall 은 사용되지 않습니다. shmall 은 리눅스 메모리의 기본단위인 4096bytes(4k) 를 기반으로 계산되어 지는데, HugPages 는 이보다 더 큰 2048k(2MB) 를 기반으로 페이지를 나누기 때문입니다.

어찌됐든 이런 모든 상황을 고려해서 사용가능한 메모리를 구한다면 다음과 같은 공식으로 구할 수 있습니다.

보시면 아시겠지만 다른분이 만들어놓은 것으로 최소 500MB 용량을 넘는 것으로해서 shmmax, shmall, hugepages 를 모두 계산하고 있습니다.

MySQL 5.x

MySQL 의 경우에, InnoDB 엔진만을 사용한다는 전제하에, 전체 메모리의 80%를 MySQL이 할당해서 사용하도록 설정합니다.

물리 메모리의 약 80%를 MySQL에 할당(InnoDB만 사용)

MySQL 은 오로지 SystemV 의 공유메모리 모델을 따릅니다. 따라서 HugePages 를 사용할 수 있는데, 이를 위해서는 다음과 같이 my.cnf 에 설정을 해줘야 합니다.

그리고 shmmax,shmall,nr_hugepages 는 앞에 스크립트를 이용해서 구합니다.

Linux 설정

SystemV 공유 메모리 모델의 경우에 몇가지를 더 해줘야 합니다.

첫째로 Transparent Huge Pages (THP) 설정을 꺼야 합니다. 성능저하가 발생한다고 하네요. 다음과 같이 간단히 처리 할 수 있습니다.

매번 부팅시마다 자동으로 설정하고 싶다면 부팅 파라메터를 수정해 줍니다.

Ubuntu 의 경우에는 다음과 같이 해줍니다.

CentOS 의 경우에는 다음과 같이 해줍니다.

확인도 가능한데, 다음과 같이 AnonHugePages 값이 0Kb 명 THP 가 비활성화 된 것입니다.

마지막으로 커널이 HugePage 를 사용할 그룹이 누군지를 지정해 줍니다.

위와같이 리눅스 시스템 사용자의 그룹ID 를 알아내도록 명령어를 입력할 수도 있고 아니면 그냥 그룹ID를 찾아서 적어줘도 됩니다.

Telegraf 설치 및 설정

Telegraf 는 서버내의 각종 지표들을 수집하는 에이전트(Agent) 프로그램 입니다. 서버 자체뿐만 아니라 각종 서버소프트웨어들에 지표도 함께 수집할 수 있으며 InfluxDB, OpenTSDB, Kafka 등과 같은 데이터소스(Datasource)에 저장하도록 할 수 있습니다.

환경

설치 및 설정 환경은 다음과 같습니다.

  • CentOS x86_64

설치

설치는 Telegraf 홈페이지에서 관련 파일을 다운로드 받으면 됩니다. Telegraf 는 배포판별로 패키지를 제공하기 때문에 편하게 설치를 할 수 있습니다.

 

설정

설정은 /etc/telegraf/telegraf.conf 파일에서 해주시면 되며, 주요 설정은 다음과 같습니다.

위 설정만으로도 주요한 Linux 시스템의 지표들을 수집할 수 있습니다. 설정을 다 했다면 다음과 같이 시작해 줍니다.

 

InfluxDB 설치 및 설정

InfluxDB 는 Time Series Database 로 각광을 받는 데이터베이스 시스템입니다. SQL 로 데이터 조회가 가능하며 Retention 설정(보유기간을 설정) 할 수 있는 특징이 있습니다.

환경

설치 환경은 다음과 같습니다.

  • CentOS x86_64

설치

다음의 페이지에서 다운로드를 받을 수 있습니다.

InfluxDB 는 각 배포판별로 패키지를 제공 합니다. 패키지를 이용하면 손쉽게 설치할 수 있고 init script 등록도 자동으로 되기 때문에 패키지 설치를 권장 합니다.

설치가 끝나면 다음과 같은 파일들을 확인할 수 있습니다.

설정

대부분의 설정은 /etc/influxdb/influxdb.conf 파일에서 이루어 집니다.  주요한 설정은 다음과 같습니다.

대략 위와같이 설정한 후에 InfluxDB 를 시작해 줍니다.

 

Database 설정

앞에서의 설정은 InfluxDB 시스템에 대한 설정이라면 이번 Database 설정은 Time Series 데이터를 위한 접근 제어, 데이터베이스 생성등에 관한 것입니다.

먼저, 전체 Database 에 최고 관리자를 생성해야 합니다. 최고 관리자는 모든 데이터베이스에 대해서 READ, WRITE 권한을 가집니다.

Ctl+D 를 누르고 나온후에 이번에는 관리자 권한을 얻기 위해서 인증 로그인을 합니다.

위와같이 관리자 인증을 통해서 내부 데이터베이스인 _internal 에 접근이 가능하며, 현재 인증된 사용자가 어떤 권한을 가지고 있는지도 살펴볼수 있습니다.

데이터베이스 및 일반 사용자 생성

이제 데이터 수집을 위한 데이터베이스와 이 데이터베이스에 접근하기 위한 일반 사용자 생성을 해보겠습니다.

먼저 데이터베이스 systemv 를 생성하고 일반 사용자인 voyager 도 생성합니다. 그리고 systemv 데이터베이스에 voyager 사용자에게 모든 권한을 부여 합니다. 이렇게 되면 voyager 사용자는 systemv 데이터베이스에만 접근이 가능한 일반 사용자가 됩니다.

이제 외부 수집서버에서 InfluxDB 로 접근할때에 일반사용자인 voyager 로 인증하고 systemv 데이터베이스에 데이터를 저장할 수 있습니다.

x86_64 시스템에서 4MB 크기 HugePageSize 변경 불가.

HugePage 는 Linux 의 기본 메모리 페이지 크기인 4K(4096) 가 아닌 더 큰 페이지를 사용하도록함으로서 잦은 메모리 액세스를 줄여 자원 소모를 줄이게 해준다.

최신의 Linux 는 전부 이것을 지원하며 다음과 같이 확인 할 수 있다.

기본 메모리 페이지는 Hugepagesize 인 2MB(2048kb) 임을 확인할 수 있다.

그런데, 이 메모리 페이지 크기를 바꿀 수 있지 않을까? 결론부터 말하면 불가능하다.

이 Hugepagesize 는 CPU 지원에 의존한다.

  • 2MB – cpu에 ‘pse’ 가 지원되면 된다.
  • 1G – cpu 가 ‘pdpe1gb’ 가 지원되면 된다.

최신의 CPU 는 위 두가지 ‘pse’, ‘pdpe1gb’ 를 모두 지원한다. 1GB 의 메모리 페이지를 지원한다. 하지만 4MB 의 메모리 페이지를 지원하지 않는다. 그렇다면 왜 이 글을 쓰는가? 이유는 MySQL 문서 때문이다.

shell> cat /proc/meminfo | grep -i huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB

https://dev.mysql.com/doc/refman/5.7/en/large-page-support.html

MySQL 문서를 보면 위와 같이 4096Kb 라고 나온다. 하지만 x86_64 시스템에서는 절대로 4096kb 가 될수가 없다. 2MB 아니면 1GB 만 가능하다.

혹시나 해서 이것을 바꾸기 위해서 다음과 같이 부팅 파라메터를 주고 재부팅을 해뒀다.

하지만 부팅 메시지에 다음과 같이 나온다.

지원하지 않는다는 메시지를 보여준다.

결론은 Hugepagesize 는 CPU 에서 지원해줘야 하는 것이며 최신의 x86_64 의 경우 2MB, 1GB 두가지만 지원한다.

Linux PAGE_SIZE 그리고 HugePage

다음의 글이 도움이 될 듯 싶다.

Kernel hugepages does not alter the calculation of SHMMAX, which you need to set large enough to fit your largest Oracle SGA. SHMMAX applies to SYS V shared memory, which can be hugepages or use conventional 4K memory pages. SHMMAX is not relevant when you use /dev/shm POSIX shared memory (Oracle AMM).


The Oracle database requires shared memory for the SGA. This can be Sys V (IPC) or POSIX /dev/shm.


Shared memory and semaphores, and the SHM kernel parameters, belong to System V IPC, which can be monitored using the ipcs command. Sys V shared memory can be configured to be 2 MB kernel hugepages, or use the default 4 KB memory pages. Kernel hugepages can drastically reduce the memory requirements for managing required memory pages and make better use of the TLB buffer.


The SHMMAX parameter is used to define the maximum size (in bytes) for a shared memory segment and should be set large enough for the largest SGA size. If the SHMMAX is set incorrectly, for example too low, you may receive the following error: ORA-27123: unable to attach to shared memory segment.


SHMMAX for a server that runs Oracle database is typically set to 4 TB or whatever the platform being x86 or x64 theoretically supports. The parameter is a safeguard parameter. A process cannot use more shared memory than available. Obviously this is not considered a risk when using a dedicated server for running Oracle database.


POSIX shared memory maps shared memory to files using a virtual shared memory filesystem in RAM. It uses /dev/shm and applies when configuring the Oracle database to use Automatic Memory Management (AMM). An Oracle instance can use either Sys V shared memory including kernel hugepages or /dev/shm for SGA, but not both at the same time. You can however use different shared memory concepts for different Oracle instances on the same server. For example, running an +ASM instance using AMM and another Oracle database instance using ASMM.

https://community.oracle.com/thread/3828422