Content Processing Performance Scaling

SharePoint 2013 has added the Content Processing Service to handle preparing documents to be indexed by the search engine.  One feature of the CPS is that it will adjust the number of processing flows depending on the number of physical cores present.  From the 2013 boundaries page:

If the number of physical cores on the host equals N, then the Content processing component will have N*K feeding sessions. K is a constant coefficient with the initial value 3. A 4-core server will have 12 feeding sessions, which means that the Content processing component can process 12 documents in parallel. You can change the value of K by setting the NumberOfCssFeedersPerCPUForRegularCrawl property of the Search Service Application. SharePoint 2013 limits the value of N upwards to 12, even if a server has more than 12 physical cores. Therefore a 16-core server will have N*K = 12 * 3 = 36 feeding sessions.

Adjusting the K is done via PowerShell, as follows:

 PS C:\> $ssa = Get-SPEnterpriseSearchServiceApplication
PS C:\> $ssa.SetProperty("NumberOfCssFeedersPerCPUForRegularCrawl", 4)
PS C:\> $ssa.GetProperty("NumberOfCssFeedersPerCPUForRegularCrawl")
4

Note that this property doesn’t exist in the ssa’s property bag until the default has been changed (so calling GetProperty on the default ssa will return an error)

To validate that your change has taken effect you can use the “Search Content Processing / Flow Instances Active” performance counter.  This number will grow or decrease as you change the value of K.   It should be equal to the NumberOfCPUOnBox * NumberOfCssFeedersPerCPUForRegularCrawl.   There may be times where you’ll see additional flows reported.  These most likely will be due to continuous crawl and are expected.   This in turn can be confirmed by looking at the “Search Gatherer Content Plugin – SharePointServerSearch / … –Continous Crawl / CTS Sessions” counters.