Enhance your munin load graph

load-day-old

This is the default output of the munin load plugin.

I’ve patched it to add a permanent blue line indicating the number of cpu of the server. The resulted graph looks like this :

load-day

You can download the patched plugin here. It is tested with Linux and FreeBSD.

Optimizing Servers and Processes for Speed with ionice, nice, ulimit

Just found this very good article about optimizing servers.

Quickly check hosts with ping

I needed a script for a quick health check of a bunch of servers.
This is how I did it using the ping command:

for((i=1;i<42;i++)); do
    ping -c 1 -W 3 host${i}.domain.com &> /dev/null
    if [ $? -ne 0 ] ; then
        echo "host${i} is down"
    else
        echo "host${i} is up"
    fi
done

You can also use netcat and check a specific port:

netcat -z -w 2  host${i}.domain.com 80 &> /dev/null

Set Terminal tab title in Mac OS X

Picture 2

I wrote previously a how-to to set your iTerm tab title.

I finally found a tool to do the same thing with the default Mac OS X Terminal.

Check it out here, it works perfectly for me!  link is dead.

On my Mac OS X 10.6.6 and bash (3.2.48(1)-release), you can set your tab title with the PROMPT_COMMAND variable as follow:

export PROMPT_COMMAND=’echo -ne “\033]0;${USER}@${HOSTNAME%%.*}\007″‘

Add this to your .bashrc or /etc/profile file and you’re done :)

Set the number of reserved filesystem blocks of a disk

The default value of “Reserved block count” takes 5% of usable disk. On a large fs like 813G, it represents about 40G.

These blocks are reserved to the super user to recover from situations where user processes fill up filesystems.
It is absolutely safe to reduce this space to one hundred or so MB.

  • check disk space of our filesystem:
$ df -h /dev/sda4
/dev/sda4             813G  418G  354G  55% /home

Before the tuning, we have 354G free.

  • check the current number of reserved blocks:
$ tune2fs -l /dev/sda4
...
Reserved block count:     10816865
...

Change this number to 20000.
The blocksize is 4096, 20000 blocks represent about 80MB.

$ tune2fs -r20000 /dev/sda4
...
Reserved block count:     20000
...
  • check disk space of our filesystem:
$ df -h /dev/sda4
/dev/sda4             813G  418G  395G  52% /home

We now have a gain of 40GB of free space!

Finding the total size of a set of files with awk

If you need to sum the total size of files in a directory or matching a pattern, an easy solution is to use awk.

I needed to calculate this total for a set of javascript files, I used this command line:

$ find App/ -name '*.js' -exec ls -l \{\} \; | awk '{sum+=$5} END {print sum}'
1929403

For a human readable result, you can divide your result and use printf to format it:

$ find App/ -name '*.js' -exec ls -l \{\} \; | awk '{sum+=$5} END {printf("%.2fM\n", sum/1024/1024)}'
1.84M

Permanent redirect with nginx

server {
    server_name domain.com;
    rewrite ^(.*)$ http://www.domain.com$1 permanent;
}

Memory usage by group of processes

While monitoring a http/php server, I needed to do some statistics about php-cgi memory usage.

Playing with memory_limit in PHP, we wanted to know the average memory usage per php-cgi process. This is easily calculated with our best friend awk.

First, get the number of php running processes:

# ps aux | grep php-cgi | grep -v grep | wc -l
126

Then, use awk to calculate the average memory usage for these processes:

# ps aux | grep --exclude=grep php-cgi | grep -v grep | awk 'BEGIN{s=0;}{s=s+$6;}END{print s/126;}'
33987.8

The number used in the calculation is the field RSS given by ps. The ps manual page says:

rss: resident set size, the non-swapped physical memory that a task has used (in kiloBytes)

You can also calculate the total memory used by all php-cgi processes:

# ps aux | grep --exclude=grep php-cgi | grep -v grep | awk 'BEGIN{s=0;}{s=s+$6;}END{print s;}'
4302028

If you need to watch the trend of this average memory usage, a little shell loop does the trick:

# while [ 1 ]; do ps aux | grep --exclude=grep php-cgi | grep -v grep | awk 'BEGIN{s=0;}{s=s+$6;}END{print s/126;}'; sleep 2; done
34401.3
34405.1
34408.4
34409.4
34414.2
34417

permanently load enable HTTP Accept Filter FreeBSD kernel module (accf_http)

While reading articles about optimization, I read about the accf_http module.

The man page of the module is here, where you can read:

The utility of accf_http is such that a server will not have to context switch several times before performing the initial parsing of the request.

To load this module, use the following command:

# kldload accf_http

To load it at boot time, add the following line in /boot/loader.conf:

accf_http_load="YES"

To check if the module is loaded, use the command kldstat:

# kldstat
Id Refs Address    Size     Name
 1    4 0xc0400000 906518   kernel
 2    1 0xc0d07000 6a32c    acpi.ko
 3    1 0xc5e65000 2000     accf_http.ko

Munin and Use of uninitializer value in eval

On some of freshly installed servers (Debian Etch), I encountered these error messages in /var/log/munin/munin-node.log:

Use of uninitialized value in eval {block} exit at /usr/sbin/munin-node line 456, <CHILD> line 8.

What a great error message :)

After digging into Google results, I found it was just a problem with host_name variable in the configuration. Default value is hostname.localdomain. I’ve replaced it with a valid hostname and it works!