You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2011/02/28 04:18:18 UTC

svn commit: r1075200 - in /trafficserver/traffic/trunk: contrib/perl/AdminClient/lib/Apache/TS/ iocore/cache/ iocore/eventsystem/ mgmt/ proxy/config/

Author: zwoop
Date: Mon Feb 28 03:18:15 2011
New Revision: 1075200

URL: http://svn.apache.org/viewvc?rev=1075200&view=rev
Log:
TS-678 Add a config option for try-lock retry delay.

This adds a configuration option

     proxy.config.cache.mutex_retry_delay INT 2

2ms seems to be fairly optimal, with little detrimental effect
on CPU usage. We'll fine tune this further in the next release.

Modified:
    trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm
    trafficserver/traffic/trunk/iocore/cache/Cache.cc
    trafficserver/traffic/trunk/iocore/cache/CacheDir.cc
    trafficserver/traffic/trunk/iocore/cache/CacheLink.cc
    trafficserver/traffic/trunk/iocore/cache/CachePart.cc
    trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc
    trafficserver/traffic/trunk/iocore/cache/P_CacheInternal.h
    trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
    trafficserver/traffic/trunk/mgmt/RecordsConfig.cc
    trafficserver/traffic/trunk/proxy/config/records.config.in

Modified: trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm (original)
+++ trafficserver/traffic/trunk/contrib/perl/AdminClient/lib/Apache/TS/AdminClient.pm Mon Feb 28 03:18:15 2011
@@ -305,6 +305,7 @@ The Apache Traffic Server Administration
  proxy.config.cache.threads_per_disk
  proxy.config.cache.url_hash_method
  proxy.config.cache.vary_on_user_agent
+ proxy.config.cache.mutex_retry_delay
  proxy.config.cli_binary
  proxy.config.cluster.cluster_configuration
  proxy.config.cluster.cluster_load_clear_duration

Modified: trafficserver/traffic/trunk/iocore/cache/Cache.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/Cache.cc?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/Cache.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/Cache.cc Mon Feb 28 03:18:15 2011
@@ -78,6 +78,7 @@ int cache_config_enable_checksum = 0;
 int cache_config_alt_rewrite_max_size = 4096;
 int cache_config_read_while_writer = 0;
 char cache_system_config_directory[PATH_NAME_MAX + 1];
+int cache_config_mutex_retry_delay = 2;
 
 // Globals
 
@@ -2675,6 +2676,9 @@ ink_cache_init(ModuleVersion v)
   Debug("cache_init", "proxy.config.cache.max_doc_size = %d = %dMb",
         cache_config_max_doc_size, cache_config_max_doc_size / (1024 * 1024));
 
+  IOCORE_EstablishStaticConfigInt32(cache_config_mutex_retry_delay, "proxy.config.cache.mutex_retry_delay");
+  Debug("cache_init", "proxy.config.cache.mutex_retry_delay = %dms", cache_config_mutex_retry_delay);
+
   // This is just here to make sure IOCORE "standalone" works, it's usually configured in RecordsConfig.cc
   IOCORE_RegisterConfigString(RECT_CONFIG, "proxy.config.config_dir", TS_BUILD_SYSCONFDIR, RECU_DYNAMIC, RECC_NULL, NULL);
   IOCORE_ReadConfigString(cache_system_config_directory, "proxy.config.config_dir", PATH_NAME_MAX);

Modified: trafficserver/traffic/trunk/iocore/cache/CacheDir.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CacheDir.cc?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CacheDir.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CacheDir.cc Mon Feb 28 03:18:15 2011
@@ -124,7 +124,7 @@ OpenDir::signal_readers(int event, Event
     EThread *t1 = newly_delayed_readers.head->mutex->thread_holding;
     if (!t1)
       t1 = mutex->thread_holding;
-    t1->schedule_in(this, MUTEX_RETRY_DELAY);
+    t1->schedule_in(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
   }
   return 0;
 }
@@ -1005,7 +1005,7 @@ Lrestart:
   {
     CACHE_TRY_LOCK(lock, gpart[part]->mutex, mutex->thread_holding);
     if (!lock) {
-      trigger = eventProcessor.schedule_in(this, MUTEX_RETRY_DELAY);
+      trigger = eventProcessor.schedule_in(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
       return EVENT_CONT;
     }
     Part *d = gpart[part];

Modified: trafficserver/traffic/trunk/iocore/cache/CacheLink.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CacheLink.cc?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CacheLink.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CacheLink.cc Mon Feb 28 03:18:15 2011
@@ -104,7 +104,7 @@ Cache::deref(Continuation * cont, CacheK
     c->last_collision = last_collision;
 
     if (!lock) {
-      c->mutex->thread_holding->schedule_in_local(c, MUTEX_RETRY_DELAY);
+      c->mutex->thread_holding->schedule_in_local(c, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
       return &c->_action;
     }
 
@@ -152,7 +152,7 @@ CacheVC::derefRead(int event, Event * e)
 Lcollision:{
     CACHE_TRY_LOCK(lock, part->mutex, mutex->thread_holding);
     if (!lock) {
-      mutex->thread_holding->schedule_in_local(this, MUTEX_RETRY_DELAY);
+      mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
       return EVENT_CONT;
     }
     if (dir_probe(&key, part, &dir, &last_collision)) {

Modified: trafficserver/traffic/trunk/iocore/cache/CachePart.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CachePart.cc?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CachePart.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CachePart.cc Mon Feb 28 03:18:15 2011
@@ -115,7 +115,7 @@ CacheVC::scanObject(int event, Event * e
 
   CACHE_TRY_LOCK(lock, part->mutex, mutex->thread_holding);
   if (!lock) {
-    mutex->thread_holding->schedule_in_local(this, MUTEX_RETRY_DELAY);
+    mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
     return EVENT_CONT;
   }
 
@@ -400,7 +400,7 @@ CacheVC::scanUpdateDone(int event, Event
     SET_HANDLER(&CacheVC::scanObject);
     return handleEvent(EVENT_IMMEDIATE, 0);
   } else {
-    mutex->thread_holding->schedule_in_local(this, MUTEX_RETRY_DELAY);
+    mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
     return EVENT_CONT;
   }
 }

Modified: trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc Mon Feb 28 03:18:15 2011
@@ -315,7 +315,7 @@ Part::aggWriteDone(int event, Event *e)
   // retaking the current mutex recursively is a NOOP
   CACHE_TRY_LOCK(lock, dir_sync_waiting ? cacheDirSync->mutex : mutex, mutex->thread_holding);
   if (!lock) {
-    eventProcessor.schedule_in(this, MUTEX_RETRY_DELAY);
+    eventProcessor.schedule_in(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
     return EVENT_CONT;
   }
   if (io.ok()) {

Modified: trafficserver/traffic/trunk/iocore/cache/P_CacheInternal.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/P_CacheInternal.h?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/P_CacheInternal.h (original)
+++ trafficserver/traffic/trunk/iocore/cache/P_CacheInternal.h Mon Feb 28 03:18:15 2011
@@ -76,24 +76,24 @@ struct EvacuationBlock;
 
 #define VC_LOCK_RETRY_EVENT() \
   do { \
-    trigger = mutex->thread_holding->schedule_in_local(this,MUTEX_RETRY_DELAY,event); \
+    trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay), event); \
     return EVENT_CONT; \
   } while (0)
 
 #define VC_SCHED_LOCK_RETRY() \
   do { \
-    trigger = mutex->thread_holding->schedule_in_local(this,MUTEX_RETRY_DELAY); \
+    trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay)); \
     return EVENT_CONT; \
   } while (0)
 
 #define CONT_SCHED_LOCK_RETRY_RET(_c) \
   do { \
-    _c->mutex->thread_holding->schedule_in_local(_c, MUTEX_RETRY_DELAY); \
+    _c->mutex->thread_holding->schedule_in_local(_c, HRTIME_MSECONDS(cache_config_mutex_retry_delay)); \
     return EVENT_CONT; \
   } while (0)
 
 #define CONT_SCHED_LOCK_RETRY(_c) \
-  _c->mutex->thread_holding->schedule_in_local(_c, MUTEX_RETRY_DELAY)
+  _c->mutex->thread_holding->schedule_in_local(_c, HRTIME_MSECONDS(cache_config_mutex_retry_delay))
 
 #define VC_SCHED_WRITER_RETRY() \
   do { \
@@ -228,6 +228,7 @@ extern int cache_config_hit_evacuate_siz
 #endif
 extern int cache_config_force_sector_size;
 extern int cache_config_target_fragment_size;
+extern int cache_config_mutex_retry_delay;
 
 // CacheVC
 struct CacheVC: public CacheVConnection
@@ -686,7 +687,7 @@ CacheVC::handleWriteLock(int event, Even
     CACHE_TRY_LOCK(lock, part->mutex, mutex->thread_holding);
     if (!lock) {
       set_agg_write_in_progress();
-      trigger = mutex->thread_holding->schedule_in_local(this, MUTEX_RETRY_DELAY);
+      trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
       return EVENT_CONT;
     }
     ret = handleWrite(EVENT_CALL, e);

Modified: trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h (original)
+++ trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h Mon Feb 28 03:18:15 2011
@@ -35,7 +35,10 @@
 // perhaps based on proxy.config.stat_api.max_stats_allowed or other configs. XXX
 #define PER_THREAD_DATA (1024*1024)
 
+// This is not used by the cache anymore, it uses proxy.config.cache.mutex_retry_delay
+// instead.
 #define MUTEX_RETRY_DELAY HRTIME_MSECONDS(20)
+
 /** Maximum number of accept events per thread. */
 #define MAX_ACCEPT_EVENTS 20
 

Modified: trafficserver/traffic/trunk/mgmt/RecordsConfig.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/mgmt/RecordsConfig.cc?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/mgmt/RecordsConfig.cc (original)
+++ trafficserver/traffic/trunk/mgmt/RecordsConfig.cc Mon Feb 28 03:18:15 2011
@@ -1032,6 +1032,8 @@ RecordElement RecordsConfig[] = {
   ,
   {RECT_CONFIG, "proxy.config.cache.enable_read_while_writer", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL}
   ,
+  {RECT_CONFIG, "proxy.config.cache.mutex_retry_delay", RECD_INT, "2", RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL}
+  ,
 
   //##############################################################################
   //  #

Modified: trafficserver/traffic/trunk/proxy/config/records.config.in
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/config/records.config.in?rev=1075200&r1=1075199&r2=1075200&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/config/records.config.in (original)
+++ trafficserver/traffic/trunk/proxy/config/records.config.in Mon Feb 28 03:18:15 2011
@@ -359,6 +359,9 @@ CONFIG proxy.config.cache.min_average_ob
    # How many I/O threads to allocate per disk (spindle). Be aware that RAID
    # disks would show up to TS as a single spindle.
 CONFIG proxy.config.cache.threads_per_disk INT 8
+   # Time (in ms) to delay until retrying to acquire a cache lock. Setting
+   # this lower will reduce latencies in some cases, but consume more CPU.
+CONFIG proxy.config.cache.mutex_retry_delay INT 11
 ##############################################################################
 #
 # DNS