Solving performance problems with Memcache Mutex extension for eZ Publish - Part II: Technical details

By Ivo Lukač -

Here is just a short technical explanation of the topic in the last blog post. That post described how we solved a performance issue on one eZ Publish based web site by developing an eZ Publish extension which overrides eZMutex to use memcache instead of file locking. The extension is published and shared with the community on projects.ez.no.

eZMutex is used by standard file handler (eZFSFileHandler). In some future post we will try also to compare this solution with a next generation file handler (eZFS2FileHanlder) included as optional module in current stable eZ Publish version.

Technical details

Default eZMutex has 3 main functions: test(), lock() and unclock(). Function test() returns bool value if the mutex exist or not. In the file based version it does 1 or 2 flock() calls:

if ( flock( $fp, LOCK_EX | LOCK_NB ) ) {
    flock( $fp, LOCK_UN );
    return false;
}
return true;

In the memcache version we only call 1 memcache action:

return memcache_get($this->mc,$this->KeyName);

Function lock() makes an exclusive lock on mutex resource. In the file based version it does 1 flock() call, 1 file_exists() call, 2 create_file() calls and 2 rename_file() calls:

if ( flock( $fp, LOCK_EX ) ) {
    $this->clearMeta();
    $this->setMeta( 'timestamp', time() );
    return true;
}
return false;

In the memcache version there, all in all, 4 memcache calls:

if ( memcache_add($this->mc,$this->KeyName,"1",false, $time) ) {
  $this->clearMeta();
  $this->setMeta( 'timestamp', time() );
  return true;
}
return false;

Function unlock() releases lock on mutex resource. In the file based version functions does 1 fclose() and 2 file_delete() calls.

if ( $fp = $this->fp() ) {
  fclose( $fp );
  @unlink( $this->MetaFileName );
  @unlink( $this->FileName );
  $GLOBALS['eZMutex_FP_' . $this->FileName] = false;
}
return false;

In there memcache version there are 2 memcache calls:

memcache_delete($this->mc,$this->MetaKeyName, 0);
memcache_delete($this->mc,$this->KeyName, 0);
return true;

To summarize the comparison on a test-lock-unlock cycle: we replaced 10-11 file system interactions with 7 memcache interactions and in practice that gives huge performance gains.

Comments

This site uses cookies. Some of these cookies are essential, while others help us improve your experience by providing insights into how the site is being used. For more detailed information on the cookies we use, please check our Privacy Policy.