I ran some testing by injecting printline statements after the beginning of 
each synchronization block
in all of the xwiki codebase and then ran some tests.

xwiki webstandards test:
pages loaded: 925
synchronization blocks entered: 2,512,524
synchronizations per page: 2,716

Excluding the first page load on start-up, these are the total synchronizations 
from running the
webstandards tests. Note that they don't add up to exactly 2,512,524 because 
some were spoiled when
2 threads tried to write to stdout simultaneously.

Total   Percent Location
1651401 65.73%  XWikiCacheStore.java:115
316411  12.59%  EmbeddableComponentManager.java:352
142094  5.66%   XWikiContext.java:260
103028  4.10%   XWiki.java:5380
58151   2.31%   XWikiContext.java:282
54891   2.18%   XWiki.java:5455
46324   1.84%   DefaultVelocityFactory.java:72
46320   1.84%   DefaultVelocityFactory.java:82
29447   1.17%   EmbeddableComponentManager.java:138
15010   0.60%   DefaultBeanManager.java:204
14595   0.58%   DefaultXWikiRenderingEngine.java:239
10933   0.44%   URIClassLoader.java:438
3812    0.15%   XWiki.java:5406
3262    0.13%   DefaultVelocityEngine.java:227
3262    0.13%   DefaultVelocityEngine.java:245
2867    0.11%   XWikiNotificationManager.java:130
1941    0.08%   XWikiGroupServiceImpl.java:798
958     0.04%   XWikiConfigurationService.java:50
958     0.04%   XWikiNotificationManager.java:254
958     0.04%   XWikiNotificationManager.java:265
957     0.04%   XWikiCacheStore.java:704
951     0.04%   XWikiNotificationManager.java:230
949     0.04%   XWikiNotificationManager.java:241
917     0.04%   XWikiNotificationManager.java:219
852     0.03%   XWikiStatsServiceImpl.java:182
371     0.01%   XWikiDocumentQueue.java:88
351     0.01%   XWikiDocumentQueue.java:55
142     0.01%   XWikiDocumentQueue.java:69
112     0.00%   XWikiDocumentQueue.java:98
66      0.00%   AdminAction.java:57
24      0.00%   RightsManager.java:164
15      0.00%   EditAction.java:59


UI tests were also run to give a more well rounded view of what real traffic 
might look like:

1666727 57.98%  XWikiCacheStore.java:115
463369  16.12%  EmbeddableComponentManager.java:352
234027  8.14%   XWiki.java:5380
175972  6.12%   XWikiContext.java:260
70156   2.44%   XWikiContext.java:282
65952   2.29%   XWiki.java:5455
43553   1.52%   DefaultVelocityFactory.java:72
43552   1.52%   DefaultVelocityFactory.java:82
33512   1.17%   EmbeddableComponentManager.java:138
13451   0.47%   DefaultBeanManager.java:204
9650    0.34%   DefaultXWikiRenderingEngine.java:239
9450    0.33%   XWikiNotificationManager.java:130
5176    0.18%   XWikiGroupServiceImpl.java:798
5019    0.17%   URIClassLoader.java:438
3965    0.14%   XWiki.java:5406
2850    0.10%   DefaultVelocityEngine.java:227
2850    0.10%   DefaultVelocityEngine.java:245
2717    0.09%   XWikiConfigurationService.java:50
2694    0.09%   XWikiCacheStore.java:704
2624    0.09%   XWikiNotificationManager.java:219
2624    0.09%   XWikiNotificationManager.java:230
2624    0.09%   XWikiNotificationManager.java:241
2590    0.09%   XWikiNotificationManager.java:254
2590    0.09%   XWikiNotificationManager.java:265
749     0.03%   XWikiDocumentQueue.java:69
718     0.02%   XWikiStatsServiceImpl.java:182
554     0.02%   XWikiDocumentQueue.java:88
550     0.02%   EmbeddableComponentManager.java:201
476     0.02%   XWikiDocumentQueue.java:55
406     0.01%   XWikiHibernateVersioningStore.java:142
403     0.01%   XWikiNotificationManager.java:140
403     0.01%   XWikiNotificationManager.java:155
403     0.01%   XWikiNotificationManager.java:167
403     0.01%   XWikiNotificationManager.java:181
403     0.01%   XWikiNotificationManager.java:194
403     0.01%   XWikiNotificationManager.java:206
282     0.01%   XWikiDocumentQueue.java:98
209     0.01%   EditAction.java:59
101     0.00%   RightsManager.java:164
81      0.00%   AdminAction.java:57
61      0.00%   EmbeddableComponentManager.java:289
52      0.00%   EmbeddableComponentManager.java:256
44      0.00%   LucenePlugin.java:656
35      0.00%   InlineAction.java:39
23      0.00%   DefaultCSRFToken.java:130
19      0.00%   MutableHttpServletRequestFactory.java:43
15      0.00%   AbstractGenericComponentManager.java:93
13      0.00%   LucenePlugin.java:450
5       0.00%   XWikiNotificationManager.java:56
2       0.00%   MacroRepository.java:65
2       0.00%   XWiki.java:408
1       0.00%   ActivityStreamCleaner.java:89
1       0.00%   EmbeddableComponentManager.java:163
1       0.00%   EmbeddableComponentManager.java:269
1       0.00%   RightsManagerListener.java:85
1       0.00%   SchedulerPlugin.java:561
1       0.00%   StackingComponentEventManager.java:69
1       0.00%   XWikiGroupServiceImpl.java:150
1       0.00%   XWikiGroupServiceImpl.java:162
1       0.00%   XWikiGroupServiceImpl.java:180
1       0.00%   XWikiHibernateBaseStore.java:142
1       0.00%   XWikiHibernateBaseStore.java:265
1       0.00%   XWikiHibernateBaseStore.java:557
1       0.00%   XWiki.java:5493
1       0.00%   XWiki.java:5515



These numbers seem to be quite conclusive that XWikiCacheStore.java:115 is the 
lowest hanging fruit
in the synchronization field. An examination of XWikiCacheStore reveals that 
the "per load"
synchronization should be avoidable if it is not lazy initialized and is 
flushed differently.

Is synchronization the best place to attack for performance gains?
Synchronization cost is difficult to measure because it varies based on number 
of processor cores and
processor sockets. In the worst case, the caches in multiple cores on multiple 
processor sockets all
need to be flushed and this would be the case with high contention mutexes.
As a matter of good practice, I think we should reduce the amount of 
synchronization as much as is reasonable.

Caleb

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to