SUMMARY
While I am fairly certain the problem is with FreeBSD, since this is
InnoDB/MySQL related, I thought I would post here to see if others have had
this problem.  I have googled several different phrases to find this answer
-- how does FreeBSD 5 set resource limits, and how do I override them
without hard-coding them into a recompiled kernel?

DETAIL
I just doubled the amount of memory in my FreeBSD 5.3 box.  Celeron (yes, I
know) 1.7Ghz, 1GB of memory now.  Before I had 512MB of memory, and was
able to run MySQL with InnoDB at 384MB innodb_buffer_pool_size.  Everything
was fine.  Now I must admit, I played with my .cnf file a bit between the
nicely running 512MB memory and restarting with 1GB, but I don't think
that's why I'm having this problem.

The box runs only sshd and mysql in addition to processes required for the
OS.  Currently with mysql running at innodb pool size of 384M, my memory
usage on the box as reported by top:

    Mem: 146M Active, 17M Inact, 114M Wired, 105M Buf, 723M Free
    Swap: 2048M Total, 2048M Free

I have enough memory available it seems.  No errors on boot, no o errors in
the /var/log(s).

I'm quite certain that the error I got was a result of resource limits set
by the kernel too low.  However, I can't, for the life of me, figure out
where they are being set, or by what.  My current theory is if I can
increase the datasize limits, I can run MySQL with InnoDB Buffer Pool Size
of 820M, or about 80% of available memory.

  ~ --> limits -H           (display Hard Limits)
  Resource limits (current):
    cputime          infinity secs
    filesize         infinity kb
    datasize           524288 kb
    stacksize           65536 kb
    coredumpsize     infinity kb
    memoryuse        infinity kb
    memorylocked     infinity kb
    maxprocesses         5547
    openfiles           11095
    sbsize           infinity bytes
    vmemoryuse       infinity kb

Nowhere in login.conf are any user or class limits being set (all are
defaulting to infinity).  I can't find anything in sysctl that would set my
datasize and stacksize to the values set here.  My kernel config has no
numbers in it -- no max size set; only NMBCLUSTERS at 16384 and a 15 second
SCSI delay.  I can't find any documentation on how to change hard limits;
everything I've read says that FreeBSD 5 modifies those limits at boot
"intelligently", and if so, should be able to be set somewhere without
recompiling the kernel using sysctl (or something else).  I've tried
setting it with limits and ulimit (as root):

    # ulimit -a
    data seg size           (kbytes, -d)  524288
    # ulimit -d 524287; ulimit -a
    data seg size           (kbytes, -d)  524287
    # ulimit -d 524288; ulimit -a
    data seg size           (kbytes, -d)  524288
    # ulimit -d 524289; ulimit -a (also tried with 786432, same result)
    data seg size           (kbytes, -d)  524288

I can set it lower, but I can't set it higher.  From dmesg.boot:

    real memory  = 1072627712 (1022 MB)
    avail memory = 1044291584 (995 MB)

The error from mysql:

    050823 06:57:16  mysqld started
    050823  6:57:17  InnoDB: Error: cannot allocate 859848704 bytes of
    InnoDB: memory with malloc! Total allocated memory
    InnoDB: by InnoDB 19166088 bytes. Operating system errno: 12
    InnoDB: Check if you should increase the swap file or
    InnoDB: ulimits of your operating system.
    InnoDB: On FreeBSD check you have compiled the OS with
    InnoDB: a big enough maximum process size.
    InnoDB: We keep retrying the allocation for 60 seconds...
    InnoDB: Fatal error: cannot allocate the memory for the buffer pool
    050823  6:58:17 [ERROR] Can't init databases
    050823  6:58:17 [ERROR] Aborting
    050823  6:58:17 [Note] /usr/local/libexec/mysqld: Shutdown complete
    050823 06:58:17  mysqld ended

My Config:

    [mysqld]
    max_connections = 100
    thread_cache_size = 20
    table_cache = 64
    max_allowed_packet = 32M
    sort_buffer_size = 512K
    read_buffer_size = 256K
    read_rnd_buffer_size = 512K
    tmp_table_size = 64M
    wait_timeout = 900

    key_buffer = 16M
    myisam_sort_buffer_size = 8M

    innodb_data_home_dir = /usr/local/db/mysql/
    innodb_data_file_path = ibdata1:50M:autoextend
    innodb_log_group_home_dir = /usr/local/db/mysql/
    innodb_log_arch_dir = /usr/local/db/mysql/
    # was 820M (80% of 1024MB)
    innodb_buffer_pool_size = 384M
    innodb_additional_mem_pool_size = 8M
    innodb_log_file_size = 10M
    innodb_log_buffer_size = 8M
    innodb_flush_log_at_trx_commit = 1
    query_cache_size = 20M
    query_cache_limit = 1M
    long_query_time = 5
    log-slow-queries = /var/log/mysql-slow-queries.log

My DB specs:
    ibdata1 is 2.6GB or so, 20 or so tables, couple million rows

I would appreciate any help.

Beckman
---------------------------------------------------------------------------
Peter Beckman                                                  Internet Guy
[EMAIL PROTECTED]                             http://www.purplecow.com/
---------------------------------------------------------------------------

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to