Difference between revisions of "MySQL Memory Usage"
From James Dooley's Wiki
(→Script) |
|||
| (9 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
| + | [[Category:Misc]] | ||
==Overview== | ==Overview== | ||
| + | Perl script to calculate MySQL max memory allotment. | ||
| + | |||
| + | Modified original code to search for cPanel defaults. | ||
==Script== | ==Script== | ||
| − | < | + | <source lang='perl'> |
| − | + | #!/usr/bin/perl | |
| − | + | # | |
| − | + | # calculate mysqld memory consumption from my.cnf | |
| − | + | # usage: mysql-memory-usage /path/to/my.cnf [/path/to/mysqld] | |
| − | + | # | |
| − | + | # $Id: mysql-memory-usage 228 2010-05-31 10:53:33Z schwenke $ | |
| − | + | ||
| − | + | my $mycnf= shift; | |
| − | + | $mycnf= "/etc/my.cnf" unless $mycnf; | |
| − | + | die "cannot read $mycnf\n" unless (-r $mycnf); | |
| − | + | ||
| − | + | my $mysqld= shift; | |
| − | + | unless ($mysqld) { | |
| − | + | # find mysqld relative to mysql | |
| − | + | $mysqld= `which mysqld` or $mysqld= `which mysql` or die; | |
| − | + | chomp $mysqld; | |
| − | + | $mysqld =~ s(bin/mysql$)(libexec/mysqld); | |
| − | + | } | |
| − | + | die "cannot execute $mysqld\n" unless (-x $mysqld); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | == | + | # read configuration |
| + | my %conf; | ||
| + | open M, "$mysqld --defaults-file=$mycnf --help --verbose |" or die; | ||
| + | while (<M>) { # skip to parameter list | ||
| + | last if (/^\-{5,} \-{5,}$/o); | ||
| + | } | ||
| + | while (<M>) { | ||
| + | last if /^$/o; | ||
| + | my ($var, $val)= split; | ||
| + | $conf{$var}= $val; | ||
| + | } | ||
| + | close M; | ||
| + | |||
| + | # static memory consumption | ||
| + | my $static= $conf{'key_buffer_size'} + $conf{'query_cache_size'}; | ||
| + | # has innodb | ||
| + | $static+= $conf{'innodb-buffer-pool-size'} + $conf{'innodb-log-buffer-size'} | ||
| + | + $conf{'innodb-additional-mem-pool-size'} if (($conf{'innodb'} eq 'TRUE') or ($conf{'innodb'} eq 'ON')); | ||
| + | |||
| + | # per thread memory consumption | ||
| + | my $thread= $conf{'thread_stack'} | ||
| + | + 2*$conf{'net_buffer_length'} + $conf{'read_buffer_size'} | ||
| + | + $conf{'read_rnd_buffer_size'} + $conf{'sort_buffer_size'}; | ||
| + | |||
| + | # writes binlog | ||
| + | $thread += $conf{'binlog_cache_size'} if ($conf{'log-bin'} ne '(No'); | ||
| + | |||
| + | # MyISAM repair thread(s) | ||
| + | my $repair= 0; | ||
| + | $repair+= $conf{'myisam_repair_threads'} * $conf{'myisam_sort_buffer_size'} | ||
| + | if ($conf{'myisam-recover'} ne 'OFF'); | ||
| + | |||
| + | # Memory (HEAP) tables | ||
| + | my $heaptables= $conf{'max_heap_table_size'}; | ||
| + | |||
| + | # temp. tables | ||
| + | my $tmptables= min($conf{'tmp_table_size'}, $conf{'max_heap_table_size'}); | ||
| + | |||
| + | # | ||
| + | # show result | ||
| + | # | ||
| + | print "$mysqld will use at most:\n"; | ||
| + | printf "%-10s for global stuff\n", p($static); | ||
| + | printf "%-10s per thread\n", p($thread); | ||
| + | printf "%-10s total (with %d active threads)\n", p($static + $conf{'max_connections'}*$thread), $conf{'max_connections'}; | ||
| + | print "and additionally:\n"; | ||
| + | printf "%-10s while recovering MyISAM tables\n", p($repair) if ($repair); | ||
| + | printf "%-10s for each HEAP table\n", p($heaptables); | ||
| + | printf "%-10s for each temporary table\n", p($tmptables); | ||
| + | exit 0; | ||
| + | |||
| + | |||
| + | sub min { | ||
| + | my ($a, $b)= @_; | ||
| + | return $a <$b ? $a : $b; | ||
| + | } | ||
| + | |||
| + | sub p { | ||
| + | my $n= shift; | ||
| + | my $prefix= 0; | ||
| + | while ($n >= 1024 && $prefix < 5) { | ||
| + | $n/= 1024; | ||
| + | $prefix++; | ||
| + | } | ||
| + | sprintf $prefix?"%.1f %s":"%d %s", $n, qw"Bytes KB MB GB TB"[$prefix]; | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | ==Usage== | ||
| + | |||
| + | Direct download and execution of script (auto mode) | ||
| + | |||
| + | <source lang='bash'>wget http://svn.jamesdooley.us/svn/JDooley/MySQLMemoryUsage/sqlmem.pl -O - | perl</source> | ||
| + | |||
| + | |||
| + | Default | ||
| + | |||
| + | <source lang='bash'>perl sqlmem.pl</source> | ||
| + | |||
| + | Defaults will use the cpanel default MySQL locations. | ||
| + | |||
| + | Specify paths | ||
| + | |||
| + | <source lang='bash'>perl sqlmem.pl [/path/to/my.cnf] [/path/to/mysqld]</source> | ||
==Credits== | ==Credits== | ||
| + | |||
| + | Original code created by: | ||
| + | |||
| + | Axel Schwenke: | ||
| + | |||
| + | http://forge.mysql.com/tools/tool.php?id=266 | ||
Latest revision as of 18:00, 8 July 2014
Contents
Overview
Perl script to calculate MySQL max memory allotment.
Modified original code to search for cPanel defaults.
Script
#!/usr/bin/perl
#
# calculate mysqld memory consumption from my.cnf
# usage: mysql-memory-usage /path/to/my.cnf [/path/to/mysqld]
#
# $Id: mysql-memory-usage 228 2010-05-31 10:53:33Z schwenke $
my $mycnf= shift;
$mycnf= "/etc/my.cnf" unless $mycnf;
die "cannot read $mycnf\n" unless (-r $mycnf);
my $mysqld= shift;
unless ($mysqld) {
# find mysqld relative to mysql
$mysqld= `which mysqld` or $mysqld= `which mysql` or die;
chomp $mysqld;
$mysqld =~ s(bin/mysql$)(libexec/mysqld);
}
die "cannot execute $mysqld\n" unless (-x $mysqld);
# read configuration
my %conf;
open M, "$mysqld --defaults-file=$mycnf --help --verbose |" or die;
while (<M>) { # skip to parameter list
last if (/^\-{5,} \-{5,}$/o);
}
while (<M>) {
last if /^$/o;
my ($var, $val)= split;
$conf{$var}= $val;
}
close M;
# static memory consumption
my $static= $conf{'key_buffer_size'} + $conf{'query_cache_size'};
# has innodb
$static+= $conf{'innodb-buffer-pool-size'} + $conf{'innodb-log-buffer-size'}
+ $conf{'innodb-additional-mem-pool-size'} if (($conf{'innodb'} eq 'TRUE') or ($conf{'innodb'} eq 'ON'));
# per thread memory consumption
my $thread= $conf{'thread_stack'}
+ 2*$conf{'net_buffer_length'} + $conf{'read_buffer_size'}
+ $conf{'read_rnd_buffer_size'} + $conf{'sort_buffer_size'};
# writes binlog
$thread += $conf{'binlog_cache_size'} if ($conf{'log-bin'} ne '(No');
# MyISAM repair thread(s)
my $repair= 0;
$repair+= $conf{'myisam_repair_threads'} * $conf{'myisam_sort_buffer_size'}
if ($conf{'myisam-recover'} ne 'OFF');
# Memory (HEAP) tables
my $heaptables= $conf{'max_heap_table_size'};
# temp. tables
my $tmptables= min($conf{'tmp_table_size'}, $conf{'max_heap_table_size'});
#
# show result
#
print "$mysqld will use at most:\n";
printf "%-10s for global stuff\n", p($static);
printf "%-10s per thread\n", p($thread);
printf "%-10s total (with %d active threads)\n", p($static + $conf{'max_connections'}*$thread), $conf{'max_connections'};
print "and additionally:\n";
printf "%-10s while recovering MyISAM tables\n", p($repair) if ($repair);
printf "%-10s for each HEAP table\n", p($heaptables);
printf "%-10s for each temporary table\n", p($tmptables);
exit 0;
sub min {
my ($a, $b)= @_;
return $a <$b ? $a : $b;
}
sub p {
my $n= shift;
my $prefix= 0;
while ($n >= 1024 && $prefix < 5) {
$n/= 1024;
$prefix++;
}
sprintf $prefix?"%.1f %s":"%d %s", $n, qw"Bytes KB MB GB TB"[$prefix];
}
Usage
Direct download and execution of script (auto mode)
wget http://svn.jamesdooley.us/svn/JDooley/MySQLMemoryUsage/sqlmem.pl -O - | perl
Default
perl sqlmem.pl
Defaults will use the cpanel default MySQL locations.
Specify paths
perl sqlmem.pl [/path/to/my.cnf] [/path/to/mysqld]
Credits
Original code created by:
Axel Schwenke: