[CalendarServer-changes] [15348] CalendarServer/trunk/contrib/performance/loadtest

source_changes at macosforge.org source_changes at macosforge.org
Mon Nov 30 13:22:41 PST 2015


Revision: 15348
          http://trac.calendarserver.org//changeset/15348
Author:   cdaboo at apple.com
Date:     2015-11-30 13:22:41 -0800 (Mon, 30 Nov 2015)
Log Message:
-----------
Multi-pod support for the sim.

Modified Paths:
--------------
    CalendarServer/trunk/contrib/performance/loadtest/accounts.csv
    CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist
    CalendarServer/trunk/contrib/performance/loadtest/config.plist
    CalendarServer/trunk/contrib/performance/loadtest/population.py
    CalendarServer/trunk/contrib/performance/loadtest/profiles.py
    CalendarServer/trunk/contrib/performance/loadtest/sim.py

Modified: CalendarServer/trunk/contrib/performance/loadtest/accounts.csv
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/accounts.csv	2015-11-30 20:25:51 UTC (rev 15347)
+++ CalendarServer/trunk/contrib/performance/loadtest/accounts.csv	2015-11-30 21:22:41 UTC (rev 15348)
@@ -1,99 +1,198 @@
-user01,user01,User 01,user01 at example.com,10000000-0000-0000-0000-000000000001
-user02,user02,User 02,user02 at example.com,10000000-0000-0000-0000-000000000002
-user03,user03,User 03,user03 at example.com,10000000-0000-0000-0000-000000000003
-user04,user04,User 04,user04 at example.com,10000000-0000-0000-0000-000000000004
-user05,user05,User 05,user05 at example.com,10000000-0000-0000-0000-000000000005
-user06,user06,User 06,user06 at example.com,10000000-0000-0000-0000-000000000006
-user07,user07,User 07,user07 at example.com,10000000-0000-0000-0000-000000000007
-user08,user08,User 08,user08 at example.com,10000000-0000-0000-0000-000000000008
-user09,user09,User 09,user09 at example.com,10000000-0000-0000-0000-000000000009
-user10,user10,User 10,user10 at example.com,10000000-0000-0000-0000-000000000010
-user11,user11,User 11,user11 at example.com,10000000-0000-0000-0000-000000000011
-user12,user12,User 12,user12 at example.com,10000000-0000-0000-0000-000000000012
-user13,user13,User 13,user13 at example.com,10000000-0000-0000-0000-000000000013
-user14,user14,User 14,user14 at example.com,10000000-0000-0000-0000-000000000014
-user15,user15,User 15,user15 at example.com,10000000-0000-0000-0000-000000000015
-user16,user16,User 16,user16 at example.com,10000000-0000-0000-0000-000000000016
-user17,user17,User 17,user17 at example.com,10000000-0000-0000-0000-000000000017
-user18,user18,User 18,user18 at example.com,10000000-0000-0000-0000-000000000018
-user19,user19,User 19,user19 at example.com,10000000-0000-0000-0000-000000000019
-user20,user20,User 20,user20 at example.com,10000000-0000-0000-0000-000000000020
-user21,user21,User 21,user21 at example.com,10000000-0000-0000-0000-000000000021
-user22,user22,User 22,user22 at example.com,10000000-0000-0000-0000-000000000022
-user23,user23,User 23,user23 at example.com,10000000-0000-0000-0000-000000000023
-user24,user24,User 24,user24 at example.com,10000000-0000-0000-0000-000000000024
-user25,user25,User 25,user25 at example.com,10000000-0000-0000-0000-000000000025
-user26,user26,User 26,user26 at example.com,10000000-0000-0000-0000-000000000026
-user27,user27,User 27,user27 at example.com,10000000-0000-0000-0000-000000000027
-user28,user28,User 28,user28 at example.com,10000000-0000-0000-0000-000000000028
-user29,user29,User 29,user29 at example.com,10000000-0000-0000-0000-000000000029
-user30,user30,User 30,user30 at example.com,10000000-0000-0000-0000-000000000030
-user31,user31,User 31,user31 at example.com,10000000-0000-0000-0000-000000000031
-user32,user32,User 32,user32 at example.com,10000000-0000-0000-0000-000000000032
-user33,user33,User 33,user33 at example.com,10000000-0000-0000-0000-000000000033
-user34,user34,User 34,user34 at example.com,10000000-0000-0000-0000-000000000034
-user35,user35,User 35,user35 at example.com,10000000-0000-0000-0000-000000000035
-user36,user36,User 36,user36 at example.com,10000000-0000-0000-0000-000000000036
-user37,user37,User 37,user37 at example.com,10000000-0000-0000-0000-000000000037
-user38,user38,User 38,user38 at example.com,10000000-0000-0000-0000-000000000038
-user39,user39,User 39,user39 at example.com,10000000-0000-0000-0000-000000000039
-user40,user40,User 40,user40 at example.com,10000000-0000-0000-0000-000000000040
-user41,user41,User 41,user41 at example.com,10000000-0000-0000-0000-000000000041
-user42,user42,User 42,user42 at example.com,10000000-0000-0000-0000-000000000042
-user43,user43,User 43,user43 at example.com,10000000-0000-0000-0000-000000000043
-user44,user44,User 44,user44 at example.com,10000000-0000-0000-0000-000000000044
-user45,user45,User 45,user45 at example.com,10000000-0000-0000-0000-000000000045
-user46,user46,User 46,user46 at example.com,10000000-0000-0000-0000-000000000046
-user47,user47,User 47,user47 at example.com,10000000-0000-0000-0000-000000000047
-user48,user48,User 48,user48 at example.com,10000000-0000-0000-0000-000000000048
-user49,user49,User 49,user49 at example.com,10000000-0000-0000-0000-000000000049
-user50,user50,User 50,user50 at example.com,10000000-0000-0000-0000-000000000050
-user51,user51,User 51,user51 at example.com,10000000-0000-0000-0000-000000000051
-user52,user52,User 52,user52 at example.com,10000000-0000-0000-0000-000000000052
-user53,user53,User 53,user53 at example.com,10000000-0000-0000-0000-000000000053
-user54,user54,User 54,user54 at example.com,10000000-0000-0000-0000-000000000054
-user55,user55,User 55,user55 at example.com,10000000-0000-0000-0000-000000000055
-user56,user56,User 56,user56 at example.com,10000000-0000-0000-0000-000000000056
-user57,user57,User 57,user57 at example.com,10000000-0000-0000-0000-000000000057
-user58,user58,User 58,user58 at example.com,10000000-0000-0000-0000-000000000058
-user59,user59,User 59,user59 at example.com,10000000-0000-0000-0000-000000000059
-user60,user60,User 60,user60 at example.com,10000000-0000-0000-0000-000000000060
-user61,user61,User 61,user61 at example.com,10000000-0000-0000-0000-000000000061
-user62,user62,User 62,user62 at example.com,10000000-0000-0000-0000-000000000062
-user63,user63,User 63,user63 at example.com,10000000-0000-0000-0000-000000000063
-user64,user64,User 64,user64 at example.com,10000000-0000-0000-0000-000000000064
-user65,user65,User 65,user65 at example.com,10000000-0000-0000-0000-000000000065
-user66,user66,User 66,user66 at example.com,10000000-0000-0000-0000-000000000066
-user67,user67,User 67,user67 at example.com,10000000-0000-0000-0000-000000000067
-user68,user68,User 68,user68 at example.com,10000000-0000-0000-0000-000000000068
-user69,user69,User 69,user69 at example.com,10000000-0000-0000-0000-000000000069
-user70,user70,User 70,user70 at example.com,10000000-0000-0000-0000-000000000070
-user71,user71,User 71,user71 at example.com,10000000-0000-0000-0000-000000000071
-user72,user72,User 72,user72 at example.com,10000000-0000-0000-0000-000000000072
-user73,user73,User 73,user73 at example.com,10000000-0000-0000-0000-000000000073
-user74,user74,User 74,user74 at example.com,10000000-0000-0000-0000-000000000074
-user75,user75,User 75,user75 at example.com,10000000-0000-0000-0000-000000000075
-user76,user76,User 76,user76 at example.com,10000000-0000-0000-0000-000000000076
-user77,user77,User 77,user77 at example.com,10000000-0000-0000-0000-000000000077
-user78,user78,User 78,user78 at example.com,10000000-0000-0000-0000-000000000078
-user79,user79,User 79,user79 at example.com,10000000-0000-0000-0000-000000000079
-user80,user80,User 80,user80 at example.com,10000000-0000-0000-0000-000000000080
-user81,user81,User 81,user81 at example.com,10000000-0000-0000-0000-000000000081
-user82,user82,User 82,user82 at example.com,10000000-0000-0000-0000-000000000082
-user83,user83,User 83,user83 at example.com,10000000-0000-0000-0000-000000000083
-user84,user84,User 84,user84 at example.com,10000000-0000-0000-0000-000000000084
-user85,user85,User 85,user85 at example.com,10000000-0000-0000-0000-000000000085
-user86,user86,User 86,user86 at example.com,10000000-0000-0000-0000-000000000086
-user87,user87,User 87,user87 at example.com,10000000-0000-0000-0000-000000000087
-user88,user88,User 88,user88 at example.com,10000000-0000-0000-0000-000000000088
-user89,user89,User 89,user89 at example.com,10000000-0000-0000-0000-000000000089
-user90,user90,User 90,user90 at example.com,10000000-0000-0000-0000-000000000090
-user91,user91,User 91,user91 at example.com,10000000-0000-0000-0000-000000000091
-user92,user92,User 92,user92 at example.com,10000000-0000-0000-0000-000000000092
-user93,user93,User 93,user93 at example.com,10000000-0000-0000-0000-000000000093
-user94,user94,User 94,user94 at example.com,10000000-0000-0000-0000-000000000094
-user95,user95,User 95,user95 at example.com,10000000-0000-0000-0000-000000000095
-user96,user96,User 96,user96 at example.com,10000000-0000-0000-0000-000000000096
-user97,user97,User 97,user97 at example.com,10000000-0000-0000-0000-000000000097
-user98,user98,User 98,user98 at example.com,10000000-0000-0000-0000-000000000098
-user99,user99,User 99,user99 at example.com,10000000-0000-0000-0000-000000000099
+user01,user01,User 01,user01 at example.com,10000000-0000-0000-0000-000000000001,PodA
+user02,user02,User 02,user02 at example.com,10000000-0000-0000-0000-000000000002,PodA
+user03,user03,User 03,user03 at example.com,10000000-0000-0000-0000-000000000003,PodA
+user04,user04,User 04,user04 at example.com,10000000-0000-0000-0000-000000000004,PodA
+user05,user05,User 05,user05 at example.com,10000000-0000-0000-0000-000000000005,PodA
+user06,user06,User 06,user06 at example.com,10000000-0000-0000-0000-000000000006,PodA
+user07,user07,User 07,user07 at example.com,10000000-0000-0000-0000-000000000007,PodA
+user08,user08,User 08,user08 at example.com,10000000-0000-0000-0000-000000000008,PodA
+user09,user09,User 09,user09 at example.com,10000000-0000-0000-0000-000000000009,PodA
+user10,user10,User 10,user10 at example.com,10000000-0000-0000-0000-000000000010,PodA
+user11,user11,User 11,user11 at example.com,10000000-0000-0000-0000-000000000011,PodA
+user12,user12,User 12,user12 at example.com,10000000-0000-0000-0000-000000000012,PodA
+user13,user13,User 13,user13 at example.com,10000000-0000-0000-0000-000000000013,PodA
+user14,user14,User 14,user14 at example.com,10000000-0000-0000-0000-000000000014,PodA
+user15,user15,User 15,user15 at example.com,10000000-0000-0000-0000-000000000015,PodA
+user16,user16,User 16,user16 at example.com,10000000-0000-0000-0000-000000000016,PodA
+user17,user17,User 17,user17 at example.com,10000000-0000-0000-0000-000000000017,PodA
+user18,user18,User 18,user18 at example.com,10000000-0000-0000-0000-000000000018,PodA
+user19,user19,User 19,user19 at example.com,10000000-0000-0000-0000-000000000019,PodA
+user20,user20,User 20,user20 at example.com,10000000-0000-0000-0000-000000000020,PodA
+user21,user21,User 21,user21 at example.com,10000000-0000-0000-0000-000000000021,PodA
+user22,user22,User 22,user22 at example.com,10000000-0000-0000-0000-000000000022,PodA
+user23,user23,User 23,user23 at example.com,10000000-0000-0000-0000-000000000023,PodA
+user24,user24,User 24,user24 at example.com,10000000-0000-0000-0000-000000000024,PodA
+user25,user25,User 25,user25 at example.com,10000000-0000-0000-0000-000000000025,PodA
+user26,user26,User 26,user26 at example.com,10000000-0000-0000-0000-000000000026,PodA
+user27,user27,User 27,user27 at example.com,10000000-0000-0000-0000-000000000027,PodA
+user28,user28,User 28,user28 at example.com,10000000-0000-0000-0000-000000000028,PodA
+user29,user29,User 29,user29 at example.com,10000000-0000-0000-0000-000000000029,PodA
+user30,user30,User 30,user30 at example.com,10000000-0000-0000-0000-000000000030,PodA
+user31,user31,User 31,user31 at example.com,10000000-0000-0000-0000-000000000031,PodA
+user32,user32,User 32,user32 at example.com,10000000-0000-0000-0000-000000000032,PodA
+user33,user33,User 33,user33 at example.com,10000000-0000-0000-0000-000000000033,PodA
+user34,user34,User 34,user34 at example.com,10000000-0000-0000-0000-000000000034,PodA
+user35,user35,User 35,user35 at example.com,10000000-0000-0000-0000-000000000035,PodA
+user36,user36,User 36,user36 at example.com,10000000-0000-0000-0000-000000000036,PodA
+user37,user37,User 37,user37 at example.com,10000000-0000-0000-0000-000000000037,PodA
+user38,user38,User 38,user38 at example.com,10000000-0000-0000-0000-000000000038,PodA
+user39,user39,User 39,user39 at example.com,10000000-0000-0000-0000-000000000039,PodA
+user40,user40,User 40,user40 at example.com,10000000-0000-0000-0000-000000000040,PodA
+user41,user41,User 41,user41 at example.com,10000000-0000-0000-0000-000000000041,PodA
+user42,user42,User 42,user42 at example.com,10000000-0000-0000-0000-000000000042,PodA
+user43,user43,User 43,user43 at example.com,10000000-0000-0000-0000-000000000043,PodA
+user44,user44,User 44,user44 at example.com,10000000-0000-0000-0000-000000000044,PodA
+user45,user45,User 45,user45 at example.com,10000000-0000-0000-0000-000000000045,PodA
+user46,user46,User 46,user46 at example.com,10000000-0000-0000-0000-000000000046,PodA
+user47,user47,User 47,user47 at example.com,10000000-0000-0000-0000-000000000047,PodA
+user48,user48,User 48,user48 at example.com,10000000-0000-0000-0000-000000000048,PodA
+user49,user49,User 49,user49 at example.com,10000000-0000-0000-0000-000000000049,PodA
+user50,user50,User 50,user50 at example.com,10000000-0000-0000-0000-000000000050,PodA
+user51,user51,User 51,user51 at example.com,10000000-0000-0000-0000-000000000051,PodA
+user52,user52,User 52,user52 at example.com,10000000-0000-0000-0000-000000000052,PodA
+user53,user53,User 53,user53 at example.com,10000000-0000-0000-0000-000000000053,PodA
+user54,user54,User 54,user54 at example.com,10000000-0000-0000-0000-000000000054,PodA
+user55,user55,User 55,user55 at example.com,10000000-0000-0000-0000-000000000055,PodA
+user56,user56,User 56,user56 at example.com,10000000-0000-0000-0000-000000000056,PodA
+user57,user57,User 57,user57 at example.com,10000000-0000-0000-0000-000000000057,PodA
+user58,user58,User 58,user58 at example.com,10000000-0000-0000-0000-000000000058,PodA
+user59,user59,User 59,user59 at example.com,10000000-0000-0000-0000-000000000059,PodA
+user60,user60,User 60,user60 at example.com,10000000-0000-0000-0000-000000000060,PodA
+user61,user61,User 61,user61 at example.com,10000000-0000-0000-0000-000000000061,PodA
+user62,user62,User 62,user62 at example.com,10000000-0000-0000-0000-000000000062,PodA
+user63,user63,User 63,user63 at example.com,10000000-0000-0000-0000-000000000063,PodA
+user64,user64,User 64,user64 at example.com,10000000-0000-0000-0000-000000000064,PodA
+user65,user65,User 65,user65 at example.com,10000000-0000-0000-0000-000000000065,PodA
+user66,user66,User 66,user66 at example.com,10000000-0000-0000-0000-000000000066,PodA
+user67,user67,User 67,user67 at example.com,10000000-0000-0000-0000-000000000067,PodA
+user68,user68,User 68,user68 at example.com,10000000-0000-0000-0000-000000000068,PodA
+user69,user69,User 69,user69 at example.com,10000000-0000-0000-0000-000000000069,PodA
+user70,user70,User 70,user70 at example.com,10000000-0000-0000-0000-000000000070,PodA
+user71,user71,User 71,user71 at example.com,10000000-0000-0000-0000-000000000071,PodA
+user72,user72,User 72,user72 at example.com,10000000-0000-0000-0000-000000000072,PodA
+user73,user73,User 73,user73 at example.com,10000000-0000-0000-0000-000000000073,PodA
+user74,user74,User 74,user74 at example.com,10000000-0000-0000-0000-000000000074,PodA
+user75,user75,User 75,user75 at example.com,10000000-0000-0000-0000-000000000075,PodA
+user76,user76,User 76,user76 at example.com,10000000-0000-0000-0000-000000000076,PodA
+user77,user77,User 77,user77 at example.com,10000000-0000-0000-0000-000000000077,PodA
+user78,user78,User 78,user78 at example.com,10000000-0000-0000-0000-000000000078,PodA
+user79,user79,User 79,user79 at example.com,10000000-0000-0000-0000-000000000079,PodA
+user80,user80,User 80,user80 at example.com,10000000-0000-0000-0000-000000000080,PodA
+user81,user81,User 81,user81 at example.com,10000000-0000-0000-0000-000000000081,PodA
+user82,user82,User 82,user82 at example.com,10000000-0000-0000-0000-000000000082,PodA
+user83,user83,User 83,user83 at example.com,10000000-0000-0000-0000-000000000083,PodA
+user84,user84,User 84,user84 at example.com,10000000-0000-0000-0000-000000000084,PodA
+user85,user85,User 85,user85 at example.com,10000000-0000-0000-0000-000000000085,PodA
+user86,user86,User 86,user86 at example.com,10000000-0000-0000-0000-000000000086,PodA
+user87,user87,User 87,user87 at example.com,10000000-0000-0000-0000-000000000087,PodA
+user88,user88,User 88,user88 at example.com,10000000-0000-0000-0000-000000000088,PodA
+user89,user89,User 89,user89 at example.com,10000000-0000-0000-0000-000000000089,PodA
+user90,user90,User 90,user90 at example.com,10000000-0000-0000-0000-000000000090,PodA
+user91,user91,User 91,user91 at example.com,10000000-0000-0000-0000-000000000091,PodA
+user92,user92,User 92,user92 at example.com,10000000-0000-0000-0000-000000000092,PodA
+user93,user93,User 93,user93 at example.com,10000000-0000-0000-0000-000000000093,PodA
+user94,user94,User 94,user94 at example.com,10000000-0000-0000-0000-000000000094,PodA
+user95,user95,User 95,user95 at example.com,10000000-0000-0000-0000-000000000095,PodA
+user96,user96,User 96,user96 at example.com,10000000-0000-0000-0000-000000000096,PodA
+user97,user97,User 97,user97 at example.com,10000000-0000-0000-0000-000000000097,PodA
+user98,user98,User 98,user98 at example.com,10000000-0000-0000-0000-000000000098,PodA
+user99,user99,User 99,user99 at example.com,10000000-0000-0000-0000-000000000099,PodA
+puser01,puser01,Puser 01,puser01 at example.com,60000000-0000-0000-0000-000000000001,PodB
+puser02,puser02,Puser 02,puser02 at example.com,60000000-0000-0000-0000-000000000002,PodB
+puser03,puser03,Puser 03,puser03 at example.com,60000000-0000-0000-0000-000000000003,PodB
+puser04,puser04,Puser 04,puser04 at example.com,60000000-0000-0000-0000-000000000004,PodB
+puser05,puser05,Puser 05,puser05 at example.com,60000000-0000-0000-0000-000000000005,PodB
+puser06,puser06,Puser 06,puser06 at example.com,60000000-0000-0000-0000-000000000006,PodB
+puser07,puser07,Puser 07,puser07 at example.com,60000000-0000-0000-0000-000000000007,PodB
+puser08,puser08,Puser 08,puser08 at example.com,60000000-0000-0000-0000-000000000008,PodB
+puser09,puser09,Puser 09,puser09 at example.com,60000000-0000-0000-0000-000000000009,PodB
+puser10,puser10,Puser 10,puser10 at example.com,60000000-0000-0000-0000-000000000010,PodB
+puser11,puser11,Puser 11,puser11 at example.com,60000000-0000-0000-0000-000000000011,PodB
+puser12,puser12,Puser 12,puser12 at example.com,60000000-0000-0000-0000-000000000012,PodB
+puser13,puser13,Puser 13,puser13 at example.com,60000000-0000-0000-0000-000000000013,PodB
+puser14,puser14,Puser 14,puser14 at example.com,60000000-0000-0000-0000-000000000014,PodB
+puser15,puser15,Puser 15,puser15 at example.com,60000000-0000-0000-0000-000000000015,PodB
+puser16,puser16,Puser 16,puser16 at example.com,60000000-0000-0000-0000-000000000016,PodB
+puser17,puser17,Puser 17,puser17 at example.com,60000000-0000-0000-0000-000000000017,PodB
+puser18,puser18,Puser 18,puser18 at example.com,60000000-0000-0000-0000-000000000018,PodB
+puser19,puser19,Puser 19,puser19 at example.com,60000000-0000-0000-0000-000000000019,PodB
+puser20,puser20,Puser 20,puser20 at example.com,60000000-0000-0000-0000-000000000020,PodB
+puser21,puser21,Puser 21,puser21 at example.com,60000000-0000-0000-0000-000000000021,PodB
+puser22,puser22,Puser 22,puser22 at example.com,60000000-0000-0000-0000-000000000022,PodB
+puser23,puser23,Puser 23,puser23 at example.com,60000000-0000-0000-0000-000000000023,PodB
+puser24,puser24,Puser 24,puser24 at example.com,60000000-0000-0000-0000-000000000024,PodB
+puser25,puser25,Puser 25,puser25 at example.com,60000000-0000-0000-0000-000000000025,PodB
+puser26,puser26,Puser 26,puser26 at example.com,60000000-0000-0000-0000-000000000026,PodB
+puser27,puser27,Puser 27,puser27 at example.com,60000000-0000-0000-0000-000000000027,PodB
+puser28,puser28,Puser 28,puser28 at example.com,60000000-0000-0000-0000-000000000028,PodB
+puser29,puser29,Puser 29,puser29 at example.com,60000000-0000-0000-0000-000000000029,PodB
+puser30,puser30,Puser 30,puser30 at example.com,60000000-0000-0000-0000-000000000030,PodB
+puser31,puser31,Puser 31,puser31 at example.com,60000000-0000-0000-0000-000000000031,PodB
+puser32,puser32,Puser 32,puser32 at example.com,60000000-0000-0000-0000-000000000032,PodB
+puser33,puser33,Puser 33,puser33 at example.com,60000000-0000-0000-0000-000000000033,PodB
+puser34,puser34,Puser 34,puser34 at example.com,60000000-0000-0000-0000-000000000034,PodB
+puser35,puser35,Puser 35,puser35 at example.com,60000000-0000-0000-0000-000000000035,PodB
+puser36,puser36,Puser 36,puser36 at example.com,60000000-0000-0000-0000-000000000036,PodB
+puser37,puser37,Puser 37,puser37 at example.com,60000000-0000-0000-0000-000000000037,PodB
+puser38,puser38,Puser 38,puser38 at example.com,60000000-0000-0000-0000-000000000038,PodB
+puser39,puser39,Puser 39,puser39 at example.com,60000000-0000-0000-0000-000000000039,PodB
+puser40,puser40,Puser 40,puser40 at example.com,60000000-0000-0000-0000-000000000040,PodB
+puser41,puser41,Puser 41,puser41 at example.com,60000000-0000-0000-0000-000000000041,PodB
+puser42,puser42,Puser 42,puser42 at example.com,60000000-0000-0000-0000-000000000042,PodB
+puser43,puser43,Puser 43,puser43 at example.com,60000000-0000-0000-0000-000000000043,PodB
+puser44,puser44,Puser 44,puser44 at example.com,60000000-0000-0000-0000-000000000044,PodB
+puser45,puser45,Puser 45,puser45 at example.com,60000000-0000-0000-0000-000000000045,PodB
+puser46,puser46,Puser 46,puser46 at example.com,60000000-0000-0000-0000-000000000046,PodB
+puser47,puser47,Puser 47,puser47 at example.com,60000000-0000-0000-0000-000000000047,PodB
+puser48,puser48,Puser 48,puser48 at example.com,60000000-0000-0000-0000-000000000048,PodB
+puser49,puser49,Puser 49,puser49 at example.com,60000000-0000-0000-0000-000000000049,PodB
+puser50,puser50,Puser 50,puser50 at example.com,60000000-0000-0000-0000-000000000050,PodB
+puser51,puser51,Puser 51,puser51 at example.com,60000000-0000-0000-0000-000000000051,PodB
+puser52,puser52,Puser 52,puser52 at example.com,60000000-0000-0000-0000-000000000052,PodB
+puser53,puser53,Puser 53,puser53 at example.com,60000000-0000-0000-0000-000000000053,PodB
+puser54,puser54,Puser 54,puser54 at example.com,60000000-0000-0000-0000-000000000054,PodB
+puser55,puser55,Puser 55,puser55 at example.com,60000000-0000-0000-0000-000000000055,PodB
+puser56,puser56,Puser 56,puser56 at example.com,60000000-0000-0000-0000-000000000056,PodB
+puser57,puser57,Puser 57,puser57 at example.com,60000000-0000-0000-0000-000000000057,PodB
+puser58,puser58,Puser 58,puser58 at example.com,60000000-0000-0000-0000-000000000058,PodB
+puser59,puser59,Puser 59,puser59 at example.com,60000000-0000-0000-0000-000000000059,PodB
+puser60,puser60,Puser 60,puser60 at example.com,60000000-0000-0000-0000-000000000060,PodB
+puser61,puser61,Puser 61,puser61 at example.com,60000000-0000-0000-0000-000000000061,PodB
+puser62,puser62,Puser 62,puser62 at example.com,60000000-0000-0000-0000-000000000062,PodB
+puser63,puser63,Puser 63,puser63 at example.com,60000000-0000-0000-0000-000000000063,PodB
+puser64,puser64,Puser 64,puser64 at example.com,60000000-0000-0000-0000-000000000064,PodB
+puser65,puser65,Puser 65,puser65 at example.com,60000000-0000-0000-0000-000000000065,PodB
+puser66,puser66,Puser 66,puser66 at example.com,60000000-0000-0000-0000-000000000066,PodB
+puser67,puser67,Puser 67,puser67 at example.com,60000000-0000-0000-0000-000000000067,PodB
+puser68,puser68,Puser 68,puser68 at example.com,60000000-0000-0000-0000-000000000068,PodB
+puser69,puser69,Puser 69,puser69 at example.com,60000000-0000-0000-0000-000000000069,PodB
+puser70,puser70,Puser 70,puser70 at example.com,60000000-0000-0000-0000-000000000070,PodB
+puser71,puser71,Puser 71,puser71 at example.com,60000000-0000-0000-0000-000000000071,PodB
+puser72,puser72,Puser 72,puser72 at example.com,60000000-0000-0000-0000-000000000072,PodB
+puser73,puser73,Puser 73,puser73 at example.com,60000000-0000-0000-0000-000000000073,PodB
+puser74,puser74,Puser 74,puser74 at example.com,60000000-0000-0000-0000-000000000074,PodB
+puser75,puser75,Puser 75,puser75 at example.com,60000000-0000-0000-0000-000000000075,PodB
+puser76,puser76,Puser 76,puser76 at example.com,60000000-0000-0000-0000-000000000076,PodB
+puser77,puser77,Puser 77,puser77 at example.com,60000000-0000-0000-0000-000000000077,PodB
+puser78,puser78,Puser 78,puser78 at example.com,60000000-0000-0000-0000-000000000078,PodB
+puser79,puser79,Puser 79,puser79 at example.com,60000000-0000-0000-0000-000000000079,PodB
+puser80,puser80,Puser 80,puser80 at example.com,60000000-0000-0000-0000-000000000080,PodB
+puser81,puser81,Puser 81,puser81 at example.com,60000000-0000-0000-0000-000000000081,PodB
+puser82,puser82,Puser 82,puser82 at example.com,60000000-0000-0000-0000-000000000082,PodB
+puser83,puser83,Puser 83,puser83 at example.com,60000000-0000-0000-0000-000000000083,PodB
+puser84,puser84,Puser 84,puser84 at example.com,60000000-0000-0000-0000-000000000084,PodB
+puser85,puser85,Puser 85,puser85 at example.com,60000000-0000-0000-0000-000000000085,PodB
+puser86,puser86,Puser 86,puser86 at example.com,60000000-0000-0000-0000-000000000086,PodB
+puser87,puser87,Puser 87,puser87 at example.com,60000000-0000-0000-0000-000000000087,PodB
+puser88,puser88,Puser 88,puser88 at example.com,60000000-0000-0000-0000-000000000088,PodB
+puser89,puser89,Puser 89,puser89 at example.com,60000000-0000-0000-0000-000000000089,PodB
+puser90,puser90,Puser 90,puser90 at example.com,60000000-0000-0000-0000-000000000090,PodB
+puser91,puser91,Puser 91,puser91 at example.com,60000000-0000-0000-0000-000000000091,PodB
+puser92,puser92,Puser 92,puser92 at example.com,60000000-0000-0000-0000-000000000092,PodB
+puser93,puser93,Puser 93,puser93 at example.com,60000000-0000-0000-0000-000000000093,PodB
+puser94,puser94,Puser 94,puser94 at example.com,60000000-0000-0000-0000-000000000094,PodB
+puser95,puser95,Puser 95,puser95 at example.com,60000000-0000-0000-0000-000000000095,PodB
+puser96,puser96,Puser 96,puser96 at example.com,60000000-0000-0000-0000-000000000096,PodB
+puser97,puser97,Puser 97,puser97 at example.com,60000000-0000-0000-0000-000000000097,PodB
+puser98,puser98,Puser 98,puser98 at example.com,60000000-0000-0000-0000-000000000098,PodB
+puser99,puser99,Puser 99,puser99 at example.com,60000000-0000-0000-0000-000000000099,PodB

Modified: CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist	2015-11-30 20:25:51 UTC (rev 15347)
+++ CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist	2015-11-30 21:22:41 UTC (rev 15348)
@@ -32,10 +32,47 @@
 			<string>./bin/python contrib/performance/loadtest/ampsim.py</string>
 		</array>
 
-		<!-- Identify the server to be load tested. -->
-		<key>server</key>
-		<string>https://127.0.0.1:8443</string>
+		<!-- Identify all the servers to be load tested. -->
+		<key>servers</key>
+		<dict>
+			<key>PodA</key>
+			<dict>
+				<key>enabled</key>
+				<true/>
 
+				<!-- Identify the server to be load tested. -->
+				<key>uri</key>
+				<string>https://localhost:8443</string>
+
+				<!--  Define whether server supports stats socket. -->
+				<key>stats</key>
+				<dict>
+					<key>enabled</key>
+					<true/>
+					<key>Port</key>
+					<integer>8100</integer>
+				</dict>
+			</dict>
+			<key>PodB</key>
+			<dict>
+				<key>enabled</key>
+				<false/>
+
+				<!-- Identify the server to be load tested. -->
+				<key>uri</key>
+				<string>https://localhost:8543</string>
+
+				<!--  Define whether server supports stats socket. -->
+				<key>stats</key>
+				<dict>
+					<key>enabled</key>
+					<true/>
+					<key>Port</key>
+					<integer>8101</integer>
+				</dict>
+			</dict>
+		</dict>
+
 		<!-- The template URI for doing initial principal lookup on. -->
 		<key>principalPathTemplate</key>
 		<string>/principals/users/%s/</string>
@@ -50,15 +87,6 @@
 			<integer>8080</integer>
 		</dict>
 
-		<!--  Define whether server supports stats socket. -->
-		<key>serverStats</key>
-		<dict>
-			<key>enabled</key>
-			<true/>
-			<key>Port</key>
-			<integer>8100</integer>
-		</dict>
-
 		<!--  Define whether client data should be re-used. It will always be saved to the specified path.-->
 		<key>clientDataSerialization</key>
 		<dict>
@@ -88,6 +116,11 @@
 					a relative path. This isn't a great solution. -->
 				<key>path</key>
 				<string>contrib/performance/loadtest/accounts.csv</string>
+
+				<!-- When there are accounts for multiple pods, interleave the accounts for each
+					pod so that the arrival mechanism will cycle clients between each pod. -->
+				<key>interleavePods</key>
+				<true/>
 			</dict>
 		</dict>
 

Modified: CalendarServer/trunk/contrib/performance/loadtest/config.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/config.plist	2015-11-30 20:25:51 UTC (rev 15347)
+++ CalendarServer/trunk/contrib/performance/loadtest/config.plist	2015-11-30 21:22:41 UTC (rev 15348)
@@ -19,10 +19,47 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 	<dict>
-		<!-- Identify the server to be load tested. -->
-		<key>server</key>
-		<string>https://localhost:8443</string>
+		<!-- Identify all the servers to be load tested. -->
+		<key>servers</key>
+		<dict>
+			<key>PodA</key>
+			<dict>
+				<key>enabled</key>
+				<true/>
 
+				<!-- Identify the server to be load tested. -->
+				<key>uri</key>
+				<string>https://localhost:8443</string>
+
+				<!--  Define whether server supports stats socket. -->
+				<key>stats</key>
+				<dict>
+					<key>enabled</key>
+					<true/>
+					<key>Port</key>
+					<integer>8100</integer>
+				</dict>
+			</dict>
+			<key>PodB</key>
+			<dict>
+				<key>enabled</key>
+				<false/>
+
+				<!-- Identify the server to be load tested. -->
+				<key>uri</key>
+				<string>https://localhost:8543</string>
+
+				<!--  Define whether server supports stats socket. -->
+				<key>stats</key>
+				<dict>
+					<key>enabled</key>
+					<true/>
+					<key>Port</key>
+					<integer>8101</integer>
+				</dict>
+			</dict>
+		</dict>
+
 		<!-- The template URI for doing initial principal lookup on. -->
 		<key>principalPathTemplate</key>
 		<string>/principals/users/%s/</string>
@@ -37,15 +74,6 @@
 			<integer>8080</integer>
 		</dict>
 
-		<!--  Define whether server supports stats socket. -->
-		<key>serverStats</key>
-		<dict>
-			<key>enabled</key>
-			<true/>
-			<key>Port</key>
-			<integer>8100</integer>
-		</dict>
-
 		<!--  Define whether client data should be re-used. It will always be saved to the specified path.-->
 		<key>clientDataSerialization</key>
 		<dict>
@@ -75,6 +103,11 @@
 					a relative path. This isn't a great solution. -->
 				<key>path</key>
 				<string>contrib/performance/loadtest/accounts.csv</string>
+
+				<!-- When there are accounts for multiple pods, interleave the accounts for each
+					pod so that the arrival mechanism will cycle clients between each pod. -->
+				<key>interleavePods</key>
+				<true/>
 			</dict>
 		</dict>
 

Modified: CalendarServer/trunk/contrib/performance/loadtest/population.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/population.py	2015-11-30 20:25:51 UTC (rev 15347)
+++ CalendarServer/trunk/contrib/performance/loadtest/population.py	2015-11-30 21:22:41 UTC (rev 15348)
@@ -162,13 +162,13 @@
 
 
 class CalendarClientSimulator(object):
-    def __init__(self, records, populator, random, parameters, reactor, server,
+    def __init__(self, records, populator, random, parameters, reactor, servers,
                  principalPathTemplate, serializationPath, workerIndex=0, workerCount=1):
         self._records = records
         self.populator = populator
         self._random = random
         self.reactor = reactor
-        self.server = server
+        self.servers = servers
         self.principalPathTemplate = principalPathTemplate
         self.serializationPath = serializationPath
         self._pop = self.populator.populate(parameters)
@@ -220,16 +220,16 @@
         authBasic = HTTPBasicAuthHandler(password_mgr=HTTPPasswordMgrWithDefaultRealm())
         authBasic.add_password(
             realm=None,
-            uri=self.server,
+            uri=self.servers[record.podID]["uri"],
             user=user.encode('utf-8'),
             passwd=record.password.encode('utf-8'))
         authDigest = HTTPDigestAuthHandler(passwd=HTTPPasswordMgrWithDefaultRealm())
         authDigest.add_password(
             realm=None,
-            uri=self.server,
+            uri=self.servers[record.podID]["uri"],
             user=user.encode('utf-8'),
             passwd=record.password.encode('utf-8'))
-        return user, {"basic": authBasic, "digest": authDigest, }
+        return record, user, {"basic": authBasic, "digest": authDigest, }
 
 
     def stop(self):
@@ -260,15 +260,15 @@
                     # runs the same arrival policy).
                     continue
 
-                _ignore_user, auth = self._createUser(number)
+                record, _ignore_user, auth = self._createUser(number)
 
                 reactor = loggedReactor(self.reactor)
                 client = clientType.new(
                     reactor,
-                    self.server,
+                    self.servers[record.podID]["uri"],
                     self.principalPathTemplate,
                     self.serializationPath,
-                    self.getUserRecord(number),
+                    record,
                     auth,
                 )
                 self.clients.append(client)
@@ -407,7 +407,7 @@
     _fail_cut_off = 1.0     # % of total count at which failed requests will cause a failure
 
     _fields_init = [
-        ('request', -25, '%-25s'),
+        ('request', -30, '%-30s'),
         ('count', 8, '%8s'),
         ('failed', 8, '%8s'),
     ]
@@ -427,7 +427,7 @@
         self._failed_clients = []
         self._failed_sim = collections.defaultdict(int)
         self._startTime = datetime.now()
-        self._expired_data = None
+        self._expired_data = {}
 
         # Load parameters from config
         if "thresholdsPath" in params:
@@ -496,7 +496,7 @@
 
 
     def simExpired(self, event):
-        self._expired_data = event['reason']
+        self._expired_data[event['podID']] = event['reason']
 
 
     def printMiscellaneous(self, output, items):
@@ -576,14 +576,14 @@
         self.printMiscellaneous(output, items)
         output.write("\n")
 
-        if self._expired_data is not None:
+        for podID, data in self._expired_data.items():
             items = {
-                "Req/sec" : "%.1f" % (self._expired_data[0],),
-                "Response": "%.1f (ms)" % (self._expired_data[1],),
-                "Slots": "%.2f" % (self._expired_data[2],),
-                "CPU": "%.1f%%" % (self._expired_data[3],),
+                "Req/sec" : "%.1f" % (data[0],),
+                "Response": "%.1f (ms)" % (data[1],),
+                "Slots": "%.2f" % (data[2],),
+                "CPU": "%.1f%%" % (data[3],),
             }
-            output.write("* Server (Last 5 minutes)\n")
+            output.write("* Server {podID} (Last 5 minutes)\n".format(podID=podID))
             self.printMiscellaneous(output, items)
             output.write("\n")
         output.write("* Details\n")

Modified: CalendarServer/trunk/contrib/performance/loadtest/profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2015-11-30 20:25:51 UTC (rev 15347)
+++ CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2015-11-30 21:22:41 UTC (rev 15348)
@@ -662,6 +662,7 @@
         return succeed("update{title}")
 
 
+
 class DescriptionChanger(EventUpdaterBase):
 
     def setParameters(
@@ -681,6 +682,7 @@
         return succeed("update{description}")
 
 
+
 class Attacher(EventUpdaterBase):
 
     def setParameters(
@@ -998,6 +1000,7 @@
             return self._newOperation("create", d)
 
 
+
 class Resetter(ProfileBase):
     """
     A Calendar user who resets their account and re-downloads everything.
@@ -1026,6 +1029,7 @@
         return self._client.reset()
 
 
+
 class OperationLogger(SummarizingMixin):
     """
     Profiles will initiate operations which may span multiple requests.  Start
@@ -1053,7 +1057,7 @@
     _fail_cut_off = 1.0     # % of total count at which failed requests will cause a failure
 
     _fields_init = [
-        ('operation', -25, '%-25s'),
+        ('operation', -30, '%-30s'),
         ('count', 8, '%8s'),
         ('failed', 8, '%8s'),
     ]

Modified: CalendarServer/trunk/contrib/performance/loadtest/sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/sim.py	2015-11-30 20:25:51 UTC (rev 15347)
+++ CalendarServer/trunk/contrib/performance/loadtest/sim.py	2015-11-30 21:22:41 UTC (rev 15348)
@@ -17,7 +17,7 @@
 ##
 from __future__ import print_function
 
-from collections import namedtuple
+from collections import namedtuple, defaultdict
 from os import environ, mkdir
 from os.path import isdir
 from plistlib import readPlist
@@ -25,6 +25,7 @@
 from sys import argv, stdout
 from urlparse import urlsplit
 from xml.parsers.expat import ExpatError
+import itertools
 import json
 import shutil
 import socket
@@ -55,15 +56,20 @@
 
 
 class _DirectoryRecord(object):
-    def __init__(self, uid, password, commonName, email, guid):
+    def __init__(self, uid, password, commonName, email, guid, podID="PodA"):
         self.uid = uid
         self.password = password
         self.commonName = commonName
         self.email = email
         self.guid = guid
+        self.podID = podID
 
 
+    def __repr__(self):
+        return "user='{}'".format(self.uid)
 
+
+
 def safeDivision(value, total, factor=1):
     return value * factor / total if total else 0
 
@@ -72,7 +78,7 @@
 def generateRecords(
     count, uidPattern="user%d", passwordPattern="user%d",
     namePattern="User %d", emailPattern="user%d at example.com",
-    guidPattern="user%d"
+    guidPattern="user%d", podID="PodA",
 ):
     for i in xrange(count):
         i += 1
@@ -81,22 +87,35 @@
         name = namePattern % (i,)
         email = emailPattern % (i,)
         guid = guidPattern % (i,)
-        yield _DirectoryRecord(uid, password, name, email, guid)
+        yield _DirectoryRecord(uid, password, name, email, guid, podID)
 
 
 
-def recordsFromCSVFile(path):
+def recordsFromCSVFile(path, interleavePods):
     if path:
         pathObj = FilePath(path)
     else:
         pathObj = FilePath(__file__).sibling("accounts.csv")
-    return [
+    records = [
         _DirectoryRecord(*line.decode('utf-8').split(u','))
         for line
-        in pathObj.getContent().splitlines()]
+        in pathObj.getContent().splitlines()
+    ]
 
+    if interleavePods:
+        # For Pods we re-order the record list so that we alternate between the pods
+        recordsByPod = defaultdict(list)
+        for record in records:
+            recordsByPod[record.podID].append(record)
 
+        records = []
+        for items in itertools.izip(*[recordsByPod[k] for k in sorted(recordsByPod.keys())]):
+            records.extend(items)
 
+    return records
+
+
+
 class LagTrackingReactor(object):
     """
     This reactor wraps another reactor and proxies all attribute
@@ -228,15 +247,14 @@
         user information about the accounts on the server being put
         under load.
     """
-    def __init__(self, server, principalPathTemplate, webadminPort, serverStats, serializationPath, arrival, parameters, observers=None,
+    def __init__(self, servers, principalPathTemplate, webadminPort, serializationPath, arrival, parameters, observers=None,
                  records=None, reactor=None, runtime=None, workers=None,
                  configTemplate=None, workerID=None, workerCount=1):
         if reactor is None:
             from twisted.internet import reactor
-        self.server = server
+        self.servers = servers
         self.principalPathTemplate = principalPathTemplate
         self.webadminPort = webadminPort
-        self.serverStats = serverStats
         self.serializationPath = serializationPath
         self.arrival = arrival
         self.parameters = parameters
@@ -278,7 +296,7 @@
             workerID = config.get("workerID", 0)
             workerCount = config.get("workerCount", 1)
             configTemplate = None
-            server = config.get('server', 'http://127.0.0.1:8008')
+            servers = config.get('servers')
             principalPathTemplate = config.get('principalPathTemplate', '/principals/users/%s/')
             serializationPath = None
 
@@ -324,7 +342,7 @@
                                                 [Eventer, Inviter, Accepter]))
         else:
             # Manager / observer process.
-            server = ''
+            servers = {}
             principalPathTemplate = ''
             serializationPath = None
             arrival = None
@@ -338,12 +356,6 @@
             if config['webadmin']['enabled']:
                 webadminPort = config['webadmin']['HTTPPort']
 
-        serverStats = None
-        if 'serverStats' in config:
-            if config['serverStats']['enabled']:
-                serverStats = config['serverStats']
-                serverStats['server'] = config['server'] if 'server' in config else ''
-
         observers = []
         if 'observers' in config:
             for observer in config['observers']:
@@ -356,13 +368,13 @@
             loader = config['accounts']['loader']
             params = config['accounts']['params']
             records.extend(namedAny(loader)(**params))
+            records = cls.filterRecords(records, servers)
             output.write("Loaded {0} accounts.\n".format(len(records)))
 
         return cls(
-            server,
+            servers,
             principalPathTemplate,
             webadminPort,
-            serverStats,
             serializationPath,
             arrival,
             parameters,
@@ -403,6 +415,22 @@
 
 
     @classmethod
+    def filterRecords(cls, records, servers):
+        """
+        Remove records that do not correspond to an enabled pod.
+
+        @param records: list of records to process
+        @type records: L{list}
+        @param servers: dictionary of servers
+        @type servers: L{dict}
+        """
+
+        # Get all enabled pod ids
+        enabled = set(filter(lambda podID: servers[podID]["enabled"], servers.keys()))
+        return filter(lambda record: record.podID in enabled, records)
+
+
+    @classmethod
     def main(cls, args=None):
         simulator = cls.fromCommandLine(args)
         raise SystemExit(simulator.run())
@@ -416,7 +444,7 @@
             Random(),
             self.parameters,
             self.reactor,
-            self.server,
+            self.servers,
             self.principalPathTemplate,
             self.serializationPath,
             self.workerID,
@@ -480,18 +508,19 @@
         Capture server stats and stop.
         """
 
-        if self.serverStats is not None:
-            _ignore_scheme, hostname, _ignore_path, _ignore_query, _ignore_fragment = urlsplit(self.serverStats["server"])
-            data = self.readStatsSock((hostname.split(":")[0], self.serverStats["Port"],), True)
-            if "Failed" not in data:
-                data = data["stats"]["5m"] if "stats" in data else data["5 Minutes"]
-                result = (
-                    safeDivision(float(data["requests"]), 5 * 60),
-                    safeDivision(data["t"], data["requests"]),
-                    safeDivision(float(data["slots"]), data["requests"]),
-                    safeDivision(data["cpu"], data["requests"]),
-                )
-                msg(type="sim-expired", reason=result)
+        for podID, server in self.servers.items():
+            if server["enabled"] and server["stats"]["enabled"]:
+                _ignore_scheme, hostname, _ignore_path, _ignore_query, _ignore_fragment = urlsplit(server["uri"])
+                data = self.readStatsSock((hostname.split(":")[0], server["stats"]["Port"],), True)
+                if "Failed" not in data:
+                    data = data["stats"]["5m"] if "stats" in data else data["5 Minutes"]
+                    result = (
+                        safeDivision(float(data["requests"]), 5 * 60),
+                        safeDivision(data["t"], data["requests"]),
+                        safeDivision(float(data["slots"]), data["requests"]),
+                        safeDivision(data["cpu"], data["requests"]),
+                    )
+                    msg(type="sim-expired", podID=podID, reason=result)
 
 
     def stopAndReport(self):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20151130/90e24a4d/attachment-0001.html>


More information about the calendarserver-changes mailing list