- OS: Windows Server 2008 R2
- Server model: Cisco UCS Blade Server
- N° of physical socket: 2
- N° of core per socket: 18
- Hyper threading: Enabled
- Processor model: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz, 2301 Mhz, 18 Core(s)
- Total number of logical processor: 72
The customer has recently migrated from an old Windows Server 2008 with 48 Logical Processor to a new Windows Server 2008 R2 with 72 logical processor.
(Why in 2018 some customers migrate their OS [Operating Systems] to 2008R2 instead of 2012R2 or better 2016? Unfortunately, the answer is easy, and in most of the cases is due to their applications requirements, like in this case)
The problem is related to the application installed on the server, because it makes high complex mathematical calculation with heavy use of the CPUs, but during this calculation the customer notice that only 36 (half of the total) of the logical processor was used, and as a result the customer notice that the old hardware with less logical processor (48 exactly) is more fast than the new hardware with 72 logical processor.
Windows Server 2008 R2 is a 64-bit operating system and it support more than 64 logical processors on a single computer.
Support for systems that have more than 64 logical processors is based on the processor group.
So, what is a processor group? A Processor Group is a set of logical processors up to 64, that is treated as a group.
Processor groups are numbered starting from the “Group 0” and if you have a server with less than 64 logical processor you have only the “Group 0”, let me show you with the Coreinfo utility:
This is the old server, each “*” is a logical processor, and in this case, we have 48 logical processor.
This is the new server with a total of 72 logical processor.
We always need to keep in mind that:
- By default, an application is constrained to a single group, which should provide ample processing capability for the typical application.
- The operating system initially assigns each process to a single group in a round-robin manner across the groups in the system.
- A process begins its execution assigned to one group. The first thread of a process initially runs in the group to which the process is assigned. Each newly created thread is assigned to the same group as the thread that created it.
Reference: Processor Groups Documentation
So how can we solve this kind of problem?
Downgrade the processor type, to have a maximum of 64 Logical Processor.
Modify the application to be compliant with the “Processor Group” (this is my favorite solution)
Try to disable from the BIOS the Hyper threading functionality, and make a performance test with the application, just to be sure to have an improvement in performance.
If you want to rewrite the application, here you can find a reference for the functions found in 2008R2.
Another thing that you need to keep in mind is that to view all the logical processor from the performance counter you can't use the “Processor” Counter, because it only show the
Use the “Processor Information” performance counter to view all the Logical processor on the server with this syntax:
|INSTANCE OF SELECTED OBJECT||DESCRIPTION|
|0,_Total||is the total of “Processor Group 0”|
|0,0||Processor Group 0, Logical Processor 0|
|0,1||Processor Group 0, Logical Processor 1|
|1,_Total||is the total of “Processor Group 1”|
|1,0||Processor Group 1, Logical Processor 0|
|1,1||Processor Group 1, Logical Processor 1|
Also, keep in mind that on Windows Server 2008 R2 you can have a performance issue if you don't have installed the following KB: Performance issues when more than 64 logical processors are used in Windows Server 2008 R2