Hi Guys,

I thought you can benefit so I share this with the community.

A few months ago I noticed that calls to Scalr DNS such as : 
$memcache->addServer("ext-memcached.memcached.yourdomain.net",11211); that 
happen on every script hit cost a lot in resources since the DNS can take 
up to a couple of seconds. Remember you have this also for databases etc...

So I wrote the function below which uses APC (on php) to cache the IP in a 
smart and efficient way.
This reduced my servers load from average of around 3 with peaks of around 
16 to Zero (on a server doing ~100 hits/sec )


Sample usage: 
$memcache->addServer(dns_resolve_cached_new("ext-memcached.memcached.yourdomain.net"),11211);

Use at your own risk. See attached image for the effect in my case 

Enjoy

Nir B



// dns_resolve_cached_new 

// use APC to cache the ip address for servers like mysql and memcache 

// Handles multiple ip addresses for the same url (such as in multiple 
mysql slaves case) 

// every 10 seconds fetch IP address again and update APC so other threads 
wont fetch also

function dns_resolve_cached_new($url){
    $now=time();
    $prefix='dnscache';  // so new version could work with older one

    $ips_array=apc_fetch($prefix.$url); // ips_array[ips][ip_addr]=last update; 
 ips_array['checketime']=[timestamp for next check]

    if (empty ($ips_array['ips']) || ($now > $ips_array['checktime']) ) { // 
every X seconds fetch ip from DNS

        // immediately write to APC so other threads wont fetch IP as well
        $ips_array['checktime']=$now+10; // check again in 10 secs;
        apc_store ($prefix.$url, $ips_array, 1000);

        // fetch IP address from DNS
        $ip=gethostbyname($url);
        $ips_array['ips'][$ip]=$now;

        // if any of the ip addresses didnt get updated for the last 100 secs 
discard it
        foreach ($ips_array['ips'] as $tmp_ip=>$update_time) 
            if (($now-$update_time) > 100 ) unset ($ips_array['ips'][$tmp_ip]);

        apc_store ($prefix.$url, $ips_array, 1000); // store updated (with new 
refresh timestamp and without discarded ips)
    }

    // get random ip if multiple ips for the url (multiple mysql slaves for 
example)
     return array_rand($ips_array['ips']);
}

-- 
You received this message because you are subscribed to the Google Groups 
"scalr-discuss" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/scalr-discuss/-/va1V0pIAoeYJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/scalr-discuss?hl=en.

<<attachment: INSTANCE_25174_1_LASNMP.monthly.gif.png>>

Reply via email to