방금 MySQL Jessie 5.5에서 MySQL Oracle Community Edition v5.6으로 업그레이드했습니다.
저는 약 230개의 데이터베이스와 32,000개가 넘는 파일/테이블을 가진 특정 MySQL 서버를 가지고 있습니다.
지난 2~3년 동안 한 번도 그런 적이 없었는데도보여주다데비안 버전에 문제가 있습니다. 이번 업그레이드 후 몇 시간이 지나서 서버에서 제공하는 서비스가 실패했습니다.
문제를 디버깅한 후 프로세스당 열린 파일 수 제한으로 인해 문제가 발생했다는 사실을 발견했습니다.
프로세스당 파일 열기 제한을 늘리는 문제를 해결했습니다. 나는 다음에 추가했다 /etc/sysctl.conf
:
fs.file-max=100000
그리고/etc/security/limits.conf
* - nofile 100000
나중에 MySQL을 다시 시작했더니 서비스가 정상으로 돌아왔습니다. 이 문제를 논의하는 문서입니다.http://duntuk.com/how-raise-ulimit-open-files-and-mysql-openfileslimit
내 서버에서:
mysql> show global variables like 'open%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| open_files_limit | 100000 |
+------------------+--------+
1 row in set (0.00 sec)
mysql> select @@table_open_cache;
+--------------------+
| @@table_open_cache |
+--------------------+
| 15000 |
+--------------------+
1 row in set (0.00 sec)
문제를 해결한 후 찾기 시작했습니다.스크립트나 코드에 차이가 있나요?Debian과 Oracle 버전 사이.
간략한 분석을 통해 둘 다 my.cnf에 있고 open_files_limit
스크립트에 "--open-files-limit" 옵션도 있다는 사실을 알게 되었는데 /usr/bin/mysqld_safe
, 이는 실제로 이전에 언급한 문서/링크로 연결되었습니다.
그러나 열린 파일 제한과 관련된 동작의 차이를 정당화하기 위한 추가 정보를 코드나 스크립트에서 찾지 못했습니다.
또한 MySQL 5.5를 사용하는 Jessie의 다른 서버에서는 table_open_cache가 실제로 더 낮다는 것을 알 수 있습니다.
mysql> select @@table_open_cache;
+--------------------+
| @@table_open_cache |
+--------------------+
| 512 |
+--------------------+
1 row in set (0.00 sec)
기본 table_open_cache 증가로 인해 이 문제가 부분적으로 설명될 수 있지만 이것이 완전히 타당하다고는 확신할 수 없습니다.
누군가 이것을 설명할 수 있나요?
답변1
서버는 덜 사용되는 오래된 서버이므로 데이터베이스/테이블이 너무 많습니다.
즉, 5.5 MySQL Debian Jessie 공식 패키지에서 5.6 MySQL Oracle 버전으로 업그레이드하면 테이블 캐시의 열린 파일 제한이 늘어납니다.
5.5에서는 오픈 테이블 캐시의 기본값이 512개 파일이었지만 5.6에서는 최소 2048개 파일인 것으로 보입니다.
루트가 아닌 사용자가 연 파일에 대한 프로세스별 제한은 기본적으로 1024로 설정되어 있으므로 이미 사용/열린 테이블이 1000개가 넘는 경우에만 문제가 나타납니다.
제한을 늘린 후 캐시는 사용자가 열 수 있는 파일의 약 10%로 자체 조정되는 것으로 보이며 추가 조사가 진행될 예정입니다.
마지막 의견은 시스템 제한을 높이거나 open_files_limit
my.cnf의 변수를 조정하거나 MySQL에 대한 매개변수를 조정하면 문제를 해결할 수 있다는 것입니다.
시스템 제한을 늘리는 또 다른 방법은 /etc/security/limits.conf
mysqld 섹션에 추가하는 것입니다. /etc/mysql/my.cnf
open_files_limit = 100000
테이블/가상 호스트/이메일 사용자 수가 많은 데이터베이스, 웹 또는 이메일 서버의 경우 열린 파일 제한을 늘리는 것이 좋습니다.
또한 데이터베이스의 응답성이 더 좋아진 것 같습니다(더 많은 테이블이 열려 있기 때문에). 그러나 제 특별한 경우에는 두 버전 간의 비교 성능 테스트를 수행하지 않았습니다.