MySQL reserva muita RAM

1

Eu tenho um VPS barato com 128Mb de RAM e 256Mb de burst. O MySQL inicia e reserva cerca de 110Mb, mas não usa mais do que 20Mb deles. Meu painel de controle VPS mostra, que eu uso 127Mb (eu também executando nginx e sphinx), eu sei, que mostra RAM reservada, mas quando eu alcanço mais de 128Mb, meu VPS reinicia automaticamente a cada 4 horas. Então eu quero forçar o MySQL a reservar menos RAM. Como eu posso fazer isso? Eu fiz alguns ajustes com my.conf mas não ajudou muito.

saída principal:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      15   0  2156  668  572 S  0.0  0.3   0:00.03 init
11311 root      15   0 11212  356  228 S  0.0  0.1   0:00.00 vzctl
11312 root      18   0  3712 1484 1248 S  0.0  0.6   0:00.01 bash
11347 root      18   0  2284  916  732 R  0.0  0.3   0:00.00 top
13978 root      17  -4  2248  552  344 S  0.0  0.2   0:00.00 udevd
14262 root      15   0  1812  564  472 S  0.0  0.2   0:00.03 syslogd
14293 sphinx    15   0 11816 1172  672 S  0.0  0.4   0:00.07 searchd
14305 root      25   0  7192 1036  636 S  0.0  0.4   0:00.00 sshd
14321 root      25   0  2832  836  668 S  0.0  0.3   0:00.00 xinetd
15389 root      18   0  3708 1300 1132 S  0.0  0.5   0:00.00 mysqld_safe
15441 mysql     15   0  113m  16m 4440 S  0.0  6.4   0:00.15 mysqld
15489 root      21   0 13056 1456  340 S  0.0  0.6   0:00.00 nginx
15490 nginx     18   0 13328 2388  992 S  0.0  0.9   0:00.06 nginx
15507 nginx     25   0 19520 5888 4244 S  0.0  2.2   0:00.00 php-cgi
15508 nginx     18   0 19636 4876 2748 S  0.0  1.9   0:00.12 php-cgi
15509 nginx     15   0 19668 4872 2716 S  0.0  1.9   0:00.11 php-cgi
15518 root      18   0  4492 1116  568 S  0.0  0.4   0:00.01 crond

Sintonizador do MySQL:

 >>  MySQLTuner 1.0.1 - Major Hayden <[email protected]>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.77
[OK] Operating on 32-bit architecture with less than 2GB RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in InnoDB tables: 1M (Tables: 1)
[OK] Total fragmented tables: 0

-------- Performance Metrics -------------------------------------------------
[--] Up for: 38m 43s (37 q [0.016 qps], 20 conn, TX: 4M, RX: 3K)
[--] Reads / Writes: 100% / 0%
[--] Total buffers: 28.1M global + 832.0K per thread (100 max threads)
[OK] Maximum possible memory usage: 109.4M (42% of installed RAM)
[OK] Slow queries: 0% (0/37)
[OK] Highest usage of available connections: 1% (1/100)
[OK] Key buffer size / total MyISAM indexes: 128.0K/64.0K
[OK] Query cache efficiency: 42.1% (8 cached / 19 selects)
[OK] Query cache prunes per day: 0
[!!] Temporary tables created on disk: 27% (3 on disk / 11 total)
[!!] Thread cache is disabled
[OK] Table cache hit rate: 57% (8 open / 14 opened)
[OK] Open file limit used: 1% (12/1K)
[OK] Table locks acquired immediately: 100% (22 immediate / 22 locks)
[!!] Connections aborted: 10%
[OK] InnoDB data size / buffer pool: 1.5M/8.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    MySQL started within last 24 hours - recommendations may be inaccurate
    Enable the slow query log to troubleshoot bad queries
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Set thread_cache_size to 4 as a starting value
    Your applications are not closing MySQL connections properly
Variables to adjust:
    tmp_table_size (> 32M)
    max_heap_table_size (> 16M)
    thread_cache_size (start at 4)

Eu acho que se eu fizer o que o MySQLtuner diz, o MySQL usará mais RAM.

    
por Buddy 06.02.2011 / 12:35

3 respostas

0

Existem vários mecanismos disponíveis no Linux para limitar a memória disponível para um processo.

Em sistemas mais novos, você pode usar cgroups e, se disponível, essa é provavelmente a melhor solução. (Use as ferramentas do pacote libcgroup para classificar automaticamente o daemon mysql em um grupo de controle de memória com memory.limit_in_bytes = 64M; ou o que for.

Em sistemas mais antigos, se o daemon mysql estiver sendo iniciado por um script, você pode simplesmente usar ulimit para restringir a memória disponível - coloque uma instrução ulimit -v 65536 no script acima onde o daemon é iniciado. / p>

Dito isto, com software moderno, isso está realmente empurrando o que você pode se safar. Você pode simplesmente precisar de mais memória RAM do que você. Uma opção pode ser mudar para o SQLite ao invés do MySQL - então você não tem um daemon separado rodando.

    
por 06.02.2011 / 16:22
1

Use o tuning-primer ou o MySQLTuner .

# wget http://mysqltuner.pl/mysqltuner.pl
--2011-01-31 06:49:46--  http://mysqltuner.pl/mysqltuner.pl
Resolving mysqltuner.pl... 174.143.142.58
Connecting to mysqltuner.pl|174.143.142.58|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 39054 (38K) [text/plain]
Saving to: 'mysqltuner.pl'

100%[==============================================================================================================================>] 39,054      54.6K/s   in 0.7s    

2011-01-31 06:49:49 (54.6 KB/s) - 'mysqltuner.pl' saved [39054/39054]

# perl mysqltuner.pl

 >>  MySQLTuner 1.0.1 - Major Hayden <[email protected]>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: 

Definir max_connections = 15

128 MB é muito pouco para o nginx, php, Sphinx e MySQL.

    
por 06.02.2011 / 13:08
0

Tente não usar o InnoDB, mas o MyISAM. Adicionar skip-innodb ao my.cnf reduzirá uma quantidade razoável de memória

    
por 06.02.2011 / 17:21