Amazon EC2, InnoDB: mmap(x바이트) 실패, errno 12로 인한 mysql 중단 시작
이를 기반으로 EC2에 마이크로 인스턴스 서버가 있습니다.
mysql 서버가 자주 고장나며 세 번째 mysql 서버가 없어집니다.로그에 표시되는 것은
120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120423 9:14:27 [Note] Plugin 'FEDERATED' is disabled.
120423 9:14:27 InnoDB: The InnoDB memory heap is disabled
120423 9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120423 9:14:27 InnoDB: Compressed tables use zlib 1.2.3
120423 9:14:27 InnoDB: Using Linux native AIO
120423 9:14:27 InnoDB: Initializing buffer pool, size = 512.0M
InnoDB: mmap(549453824 bytes) failed; errno 12
120423 9:14:27 InnoDB: Completed initialization of buffer pool
120423 9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120423 9:14:27 [ERROR] Plugin 'InnoDB' init function returned error.
120423 9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120423 9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB
120423 9:14:27 [ERROR] Aborting
가 뭐야?failed; errno 12이 문제를 해결하기 위해 어떻게 더 많은 공간/메모리 등을 제공할 수 있을까요?
매번 시스템 전체를 재부팅하고 로그를 모두 삭제하고 mysql 서버를 재시작하여 이 문제를 해결합니다.하지만 제 구성에 문제가 있다는 것을 알고 있습니다.
또한 my.cnf는 다음과 같습니다.
[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# max_allowed_packet=500M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_buffer_pool_size = 512M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
RDS를 사용하지 않고 마이크로인스턴스에서 워드프레스를 실행하려고 했을 때도 같은 문제가 발생했습니다.
스왑 페이지를 추가하면 문제가 해결되었습니다.
다음 단계에 따라 스왑 공간을 설정할 수 있습니다.
그래도 문제가 해결되지 않으면 RDS 서비스를 사용해 보십시오.
===============================================
저는 블로그의 내용을 참고로 복사했습니다.다음 블로그 작성자에게 공로가 돌아옵니다.
Amazon EC2 마이크로 인스턴스 스왑 공간 - Linux
Amazon EC2 Linux Micro 인스턴스가 있습니다.Micro 인스턴스의 메모리는 613MB밖에 없기 때문에 MySQL은 때때로 크래쉬합니다.MySQL, Micro Instance 및 Memory Management에 대해 오랜 시간 검색한 결과 Micro 인스턴스의 기본 스왑 공간이 없다는 것을 알게 되었습니다.따라서 크래시를 방지하려면 마이크로 인스턴스의 스왑 공간을 설정해야 합니다.실제로 스왑을 사용하도록 설정하는 것이 성능 향상입니다.
다음 절차는 Micro 인스턴스의 스왑 공간을 만드는 방법을 보여 줍니다.Micro 인스턴스가 실행 중인 AWS 계정이 있을 것입니다.
- 실행합니다.
dd if=/dev/zero of=/swapfile bs=1M count=1024 - 실행합니다.
mkswap /swapfile - 실행합니다.
swapon /swapfile - 을 추가합니다.
/swapfile swap swap defaults 0 0로로 합니다./etc/fstab
재기동할 때마다 자동적으로 스왑 파일을 유효하게 하는 경우는, 순서 4가 필요합니다.
SWAP 공간과 관련된 몇 가지 유용한 명령어는 다음과 같습니다.
$ swapon -s
$ free -k
$ swapoff -a
$ swapon -a
참고 자료:
- http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
- http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instances/
- http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
- http://aws.amazon.com/ec2/instance-types/
아마존 EC2입니다.다음 사항을 추가하여 inno_db의 메모리 사용량을 줄이려고 했습니다./etc/my.cnf
innodb_module_pool_size = 64M
그게 안 되더라고요, 16M으로 떨어뜨려도 안 되더라고요.그 후 인스턴스에는 기본적으로 빈 메모리가 전혀 없다는 것을 깨달았습니다.그래서 아파치를 다시 시작해보았습니다.
sudo 시스템httpd 재시작sudo 시스템 mysqld 재시작
그리고 모든 것이 잘 작동했어요.다른 해결책은 Apache를 구성하여 메모리를 너무 많이 소모하지 않도록 하는 것입니다.
게시물에 표시된 my.cfg 파일의 innodb_buffer_pool_size에 128M의 메모리를 요구하고 있는 것처럼 보이지만 MySQL은 512M의 메모리를 요구하고 있다고 생각합니다.
버퍼 풀을 초기화하는 중. 크기 = 512.0m
몇 줄 아래로 내려가면 MySQL이 InnoDB 버퍼 풀에 충분한 메모리(512M)를 예약할 수 없기 때문에 시작되지 않습니다.
치명적인 오류: 버퍼 풀에 메모리를 할당할 수 없습니다.
여기에는 세 가지 질문이 있습니다.
- 인스턴스의 메모리 용량이 얼마나 됩니까?512M InnoDB가 버퍼 풀, MySQL이 할당하는 다른 모든 것, 애플리케이션 및 운영체제를 수용할 수 있는 충분한 메모리가 있어야 합니까?
- InnoDB는 왜 당신이 생각하는 것보다 더 많은 것을 가져가려고 하는가?
- MySQL이 재부팅되는 이유는 무엇입니까?
1번으로 대답하세요.
2. MySQL 옵션 파일을 저장할 수 있는 장소가 몇 개 있습니다.이후 발견된 파일은 이전에 발견된 파일에 지정된 옵션을 재정의합니다.봐
http://dev.mysql.com/doc/refman/5.5/en/option-files.html
문제 3. 기동 후에 발생하는 메모리 부족 상태가 원인일 수 있습니다.이 경우 로그에는 그 표시가 표시됩니다.
마지막으로 EBS 백업 인스턴스를 사용하고 있습니까?이는 일반적으로 데이터베이스 서버(실제로 특별한 상황이 없는 모든 인스턴스)에 권장됩니다.자세한 것은, 을 참조해 주세요.
https://stackoverflow.com/a/3630707/141172
이 문제는 EC2 인스턴스에 스왑 볼륨을 추가하여 해결되었습니다.내 서비스는 단순히 박스 안의 모든 메모리를 소모하고 있어서 고장날 뻔했다.RedHat/CentOS 관리자가 된 지 몇 년이 지났지만, Anaconda는 무료 Ubuntu EC2 인스턴스가 하지 못한 많은 작업을 수행합니다.
웹 콘솔에서 2Gb 볼륨을 생성하여 인스턴스에 연결하고 mkswap /dev/[whatter], /etc/fstab 편집, 크래시 중지만 하면 됩니다.
이러한 인스턴스는 대부분의 사용자에게 익숙한 미디어 기반 OS 설치처럼 설치되지 않습니다. 패키지나 적절한 파일 시스템 없이 완전히 제거되며 AppArmor와 같은 기능을 모르거나 구성 방법을 모를 경우 모든 문제가 발생합니다.
문제는 서버에 MySQL 프로세스에 할당하기에 충분한 메모리가 없다는 것입니다.이 문제에는 몇 가지 해결책이 있습니다.
(1) 물리 RAM을 증설한다.1GB의 RAM을 추가하면 문제가 해결됩니다. (2) 스왑 공간을 할당합니다.기본적으로 Digital Ocean VPS 인스턴스는 스왑 공간을 사용하도록 구성되어 있지 않습니다.512MB의 스왑 공간을 할당함으로써 이 문제를 해결할 수 있었습니다.서버에 스왑 영역을 추가하려면 , 다음의 순서에 따라 주세요.
## As a root user, perform the following:
# dd if=/dev/zero of=/swap.dat bs=1024 count=512M
# mkswap /swap.dat
# swapon /swap.dat
## Edit the /etc/fstab, and the following entry.
/swap.dat none swap sw 0 0
MySQL 버퍼 풀 크기 축소
## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M
또한 디스크 공간도 확인하십시오.공간이 충분한지 확인합니다.
df-h
간단한 답변:
* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld
자세한 답변:
이는 특히 1GB 이하의 RAM과 같이 매우 작은 VPS를 사용하는 사용자에게 중요한 질문입니다.MySQL이 삭제될 경우 서버 구성(Apache | nginx) 또는 MySQL 구성에 문제가 있을 수 있습니다.DOS 공격에 의해 시스템자원 사용량이 급증할 수 있습니다(이미지 참조).결과적으로 MySQL 프로세스는 커널에 의해 셧다운됩니다.장기적인 솔루션에서는 Apache 또는 MySQL 구성을 최적화하는 방법을 검토해야 합니다.
MySQL 매뉴얼과 Percona 블로그뿐만 아니라 Stack Overflow에 대해서도 몇 가지 논의가 있습니다.
MySQL 설명서 - MySQL의 메모리 사용 방법:
https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
Percona - 최적의 MySQL 메모리 사용률을 설정하기 위한 베스트 프랙티스:
https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/
MySQ를 사용하여 MySQL 성능을 최적화하는 방법LTuner:
https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/
Apache 메모리 사용량 구성:
https://serverfault.com/questions/254436/apache-memory-usage-optimization
Apache 퍼포먼스 튜닝 매뉴얼:
https://httpd.apache.org/docs/2.4/misc/perf-tuning.html
Apache 서버 조정:
https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/
다만, 원래의 질문에 대해서는, MySQL 서비스가 로드되어 액티브한지를 체크하고, 로드되어 액티브하지 않은 경우는 MySQL을 재기동하는 임시 솔루션을 스크립트 할 수 있습니다.
운영 체제Centent의 .OS Linux
.systemctl status mysql맨 위에 서비스가 로드되어 활성화되어 있음을 알 수 있습니다.
[root@centos-mysql-demo ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 3353 (mysqld)
CGroup: /system.slice/mysqld.service
└─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.
서비스가 로드되지 않은 경우 다음과 같은 명령어를 사용합니다.
systemctl status mysqld || systemctl restart mysqld
프로세스를 재기동합니다.다음과 같이 설정할 수 있습니다.
* * * * * systemctl status mysqld || systemctl restart mysqld
단, mysql이 로드되어도 서비스가 활성화되지 않은 경우 cron은 아무것도 하지 않습니다.따라서 다음과 같은 보다 자세한 명령을 사용해야 합니다.
* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld
이 경우 서비스가 로드되어 있지만 DOS 공격이 mysql 서비스를 종료할 수 있는 상태 등 비활성화되어 있는 경우 명령어는 mysql도 재시작합니다.사용방법--quietflag는 상태 코드를 반환하는 명령만 지정하며 화면에 아무것도 출력하지 않습니다.--quiet 중 하나가 됩니다.active ★★★★★★★★★★★★★★★★★」inactive.
또한 다음과 같이 서버에 사용 가능한 RAM 리소스를 추가하기 위해 일부 스왑 공간을 만들 수도 있습니다.
sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h
다음 솔루션 중 하나를 사용합니다.
물리 RAM을 늘립니다.1GB의 메모리를 추가하면 문제가 해결됩니다.
다음 구성 변경을 사용하여 SWAP 공간을 할당합니다.
설정
dd if=/dev/zero of=/extraswap bs=1024 count=512M
mkswap /extraswap
swapon /extraswap
## Edit the /etc/fstab, and the following entry.
/extraswap none swap sw 0 0
언급URL : https://stackoverflow.com/questions/10284532/amazon-ec2-mysql-aborting-start-because-innodb-mmap-x-bytes-failed-errno-12
'programing' 카테고리의 다른 글
| 오늘보다 3개월 전의 날짜를 자바스크립트로 계산하려면 어떻게 해야 하나요? (0) | 2022.11.24 |
|---|---|
| pip을 사용하여 특정 패키지 버전 설치 (0) | 2022.11.24 |
| Java에서의 GPGPU/CUDA/OpenCL에 대한 최선의 접근법 (0) | 2022.11.24 |
| MySQL 임시 테이블 vs where in 절 (0) | 2022.11.24 |
| Java String이 모든 공백 공간이 아님을 확인하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
