MySql Processlist가 "절전" 항목으로 채워져 "너무 많은 연결"이 발생합니까?
php/mysql 접속에 관한 오래된 문제에 대해 도움을 요청하고 싶습니다.
"SHOW PROCESSLIST" 명령을 실행할 때마다 약 400개의 유휴 상태가 표시됩니다(상태:sleep)을 통해 5대의 웹 서버에서 데이터베이스 서버에 접속할 수 있습니다.
이는 최근 트래픽 수가 증가하기 전까지 큰 문제가 되지 않았습니다(빠른 해결 방법을 찾지 못했습니다). MySQL에서 "to many connections" 문제를 반복적으로 보고한 이후 이러한 연결 중 350개 이상이 "sleep" 상태입니다.또한 동일한 서버에 대한 sleep 연결이 있더라도 서버가 MySQL 연결을 가져올 수 없습니다.
Apache 서버가 다시 작성되면 모든 연결이 사라집니다.
데이터베이스 연결을 작성하기 위해 사용되는 PHP 코드는 일반 "mysql" 모듈인 "mysqli" 모듈인 PEAR::DB 및 Zend Framework DB 어댑터(다른 프로젝트).영구 연결을 사용하는 프로젝트는 없습니다.
접속 제한을 높이는 것은 가능하지만, 현재는 450으로 되어 있고, 「실제」접속은 한 번에 20~100개 밖에 없기 때문에, 좋은 해결책이라고는 생각되지 않습니다.
질문입니다.
sleep 상태에서 연결이 많은 이유는 무엇이며 어떻게 하면 예방할 수 있습니까?
-- 갱신:
한 번에 실행되는 Apache 요청의 수는 50개를 넘지 않기 때문에 연결을 닫거나 phpscript가 연결되어 있지 않은 상태에서 apache가 포트를 열어두는 데 문제가 있을 수 있습니다(?).
my.cnf 를 참조해 주세요.
innodb_buffer_pool_size = 1024M
max_allowed_packet = 5M
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 8M
query_cache_size = 512M
myisam_sort_buffer_size = 128M
max_connections = 450
thread_cache = 50
key_buffer_size = 1280M
join_buffer_size = 16M
table_cache = 2048
sort_buffer_size = 64M
tmp_table_size = 512M
max_heap_table_size = 512M
thread_concurrency = 8
log-slow-queries = /daten/mysql-log/slow-log
long_query_time = 1
log_queries_not_using_indexes
innodb_additional_mem_pool_size = 64M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table
기본적으로 다음과 같은 경우 sleep 상태로 연결이 설정됩니다.
- PHP 스크립트가 MySQL에 연결됨
- 일부 쿼리가 실행됩니다.
- PHP 스크립트는 시간이 걸리는 작업을 수행합니다.
- DB에서 연결을 끊지 않고
- PHP를 사용하다
- 즉, MySQL 서버와의 접속이 끊어집니다.
따라서 데이터베이스 측에서 실제로 아무것도 하지 않고 연결된 상태로 유지되는 PHP 프로세스가 많으면 일반적으로 많은 프로세스가 sleep 상태가 됩니다.
기본적인 생각: PHP 프로세스가 너무 오래 실행되지 않는지 확인하거나 데이터베이스에 더 이상 액세스할 필요가 없는 즉시 강제로 연결을 끊습니다.
서버에 볼 수 것: 「 」, 「 」, 「 」, 「 」, 「 。
- 아파치
- 즉, 생성해야 할 페이지가 많다는 뜻입니다.
- 각 PHP 스크립트는 페이지를 생성하기 위해 DB에 연결하여 몇 가지 쿼리를 수행합니다.
- DB 서버의 부하가 증가함에 따라 이러한 쿼리는 시간이 점점 더 걸립니다.
- 즉, 더 많은 프로세스가 쌓이고
가장 긴 쿼리를 최적화하는 방법으로 쿼리에 걸리는 시간을 단축할 수 있습니다.
위의 솔루션은 쿼리 실행과 같습니다.
SET session wait_timeout=600;
mysql이 재시작될 때까지만 작동합니다.영속적인 솔루션의 경우 mysql.conf를 편집하고 [mysqld] 뒤에 추가합니다.
wait_timeout=300
interactive_timeout = 300
여기서 300은 원하는 초수입니다.
최대 연결 수를 늘려도 문제가 해결되지 않습니다.
서버에서도 같은 상황이 발생하고 있었습니다.이런 일이 일어나다
사용자는 데이터베이스에 접속하고 데이터베이스에 쿼리를 실행해도 쿼리(쿼리)가 완료되지 않아 페이지를 떠나거나 다른 페이지로 이동합니다.따라서 열려 있던 연결은 열린 상태로 유지되며, 더 많은 사용자가 DB에 연결하여 유사한 작업을 수행할 경우 연결 수가 계속 증가합니다.
interactive_timeout MySQL을 설정할 수 있습니다.기본값은 28800(8시간)에서 1시간입니다.
SET interactive_timeout=3600
max_connections 변수를 늘리기 전에 show processlist 명령을 실행하여 인터랙티브하지 않은 연결 수를 확인해야 합니다.
sleep 연결이 많은 경우 대기 후 인터랙티브하지 않은 연결을 닫으려면 wait_timeout 변수 값을 줄여야 합니다.
- wait_timeout 값을 표시하려면:
'wait_timeout'과 같은 세션 변수를 표시합니다.
+---------------+-------+
| Variable_name | 값 |
+---------------+-------+
| wait_backets | 28800 |
+---------------+-------+
값은 2초입니다.즉, 비연속 접속은 최대 8시간입니다.
- wait_timeout 변수 값을 변경하려면 다음 절차를 수행합니다.
SET 세션 wait_sessions=600, 쿼리 확인, 0행 영향(0.00초)
sleep 연결이 sleep 상태로 유지되면 10분 후 mysql 또는 MariaDB가 연결을 끊습니다.
그래서 워드프레스 블로그에서 이 문제를 해결하기 위해 모든 해결책을 시도해본 후에, 나는 정말 바보같거나 천재적인 일을 했을지도 모른다.왜 Mysql 접속이 증가하는지 알 수 없어서 아래의 php 스크립트를 헤더에 사용하여 sleep 프로세스를 모두 종료했습니다.
그래서 내 사이트를 방문하는 모든 사람들이 수면 과정을 없애는데 도움을 주죠
<?php
$result = mysql_query("SHOW processlist");
while ($myrow = mysql_fetch_assoc($result)) {
if ($myrow['Command'] == "Sleep") {
mysql_query("KILL {$myrow['Id']}");}
}
?>
그래서 300개의 PHP 프로세스를 동시에 실행하고 초당 60~90의 속도를 얻었습니다(내 프로세스는 3배 쿼리를 포함합니다).400까지 올렸더니 이게 초당 40~50까지 떨어졌어요.200까지 내려갔다가 60~90으로 돌아왔어!
그래서 이 문제가 있는 사람에게 조언하고 싶은 것은 달리기를 적게 하는 실험을 해서 그것이 개선되는지 알아보라는 것입니다.메모리 및 CPU 사용량이 줄어들기 때문에 실행되는 프로세스의 처리 능력이 향상되고 속도가 향상될 수 있습니다.
영구 MySQL 연결을 확인합니다.를 사용하여 접속했습니다.mysqli('p:$HOSTNAME')라라벨 데이터베이스를 가지고 있었어요다음과 같은 php 설정:
'options' => [
PDO::ATTR_PERSISTENT => true,
],
어떤 이유에선지, 한동안은, 내 애플리케이션이 연결을 공유할 것이라고 생각했기 때문에 연결을 유지하는 것이 현명하다고 생각했습니다.그들은 하지 않았다.그냥 접속을 열어놓고 타임아웃 될 때까지 사용하지 않고 놔뒀어요.
지속성에 대한 꿈을 없앤 후 여러 호스트에서 120~150개 이상의 접속에서 소수의 호스트만 접속할 수 있게 되었습니다.대부분의 경우 실제로 1개만 접속할 수 있게 되었습니다(실행하고 있는 호스트).SHOW PROCESSLIST).
언급URL : https://stackoverflow.com/questions/2407732/mysql-proccesslist-filled-with-sleep-entries-leading-to-too-many-connections
'source' 카테고리의 다른 글
| 브라우저가 두 번 새로 고쳐질 때까지 NodeJS 스크립트가 응답하지 않음 (0) | 2022.11.02 |
|---|---|
| Asyncio.gather와 Asyncio.잠깐만요. (0) | 2022.11.02 |
| SELECT에 의해 반환된 결과에 연속 의사 행 번호 할당 (0) | 2022.11.02 |
| 그래들 의존관계 그래프에서 '->'(화살표)는 무엇을 의미합니까? (0) | 2022.11.02 |
| 느린 쿼리 로그(MariaDB)에 시간이 많이 걸린다 (0) | 2022.11.02 |