As you know from my recent posts, I've been hanging out at 1,200 concurrent Subscribers trying to boost performance. When I first hit the 1,200 Subscriber mark, I was able to change and replicate ~13 million rows per hour. I was happy with the scalability, but the performance was no better than what I achieved with 600 concurrent Subscribers. Rather than push the scalability envelope out to 1,800 or 2,400 Subscribers, I decided to tweak, poke and prod my portable data center until I could get better performance at the 1,200 level. I succeeded with the architecture you see below: Sometimes more is more. Sometimes less is more. Knowing that the ISAPI DLL running on IIS is the biggest bottleneck in the system, I decided to scale out to 6 IIS servers in addition to my separate SQL Publisher and SQL Distributor servers. The 2 SQL Servers have 8 cores and 16 GB of RAM while the 6 IIS servers contain 2 cores and 2 GB of RAM. Each IIS server would accomodate 200 concurrent clients each. In the last week of December 2007, I throttled back the MAX_THREADS_PER_POOL registry setting on the IIS servers from the default of 20 to just 3 and ran my test harness. This resulted in the changing and replicating of ~15 millions rows per hour; a boost of 2 million rows per hour over my previous test. Using fewer threads on each IIS box meant lower memory and CPU utilization across the board. Instead of overwhelming SQL Server will lots of threads trying to perform work all at the same time, SQL Server got to chill out and thus processed each sync much faster. This was great news so I pushed the fewer threads experiment even further. I executed my test harness with 2 threads and then just 1 thread per IIS server. Using just 1 thread resulted in the changing and replicating of ~18 million rows per hour; a 3 million row per hour boost over using 3 threads per IIS server. At ~21 million row changes per hour, 2 threads per IIS server is the sweet spot! Rows changed: 5,826 per second | 349,600 per minute | 20,976,000 per hour | 503,424,000 per day Bytes per row: 116 Data replicated: 2.3 GB per hour | 55 GB per day The longest and average sync times dropped significantly over the first results I got with 1,200 concurrent Subscribers: Longest sync time: 14 minutes Shortest sync time: .6 seconds Average sync time: 3 minutes, 38 seconds The IIS didn't break a sweat: IIS1: CPU: 11% | Mem: 172 MB | Network Utilization: 89% Disk I/O: OS: .3%, ISAPI: 3.8% IIS2: CPU: 8% | Mem: 167 MB ...