Remember that normally, schedulers are not bound
to CPUs in a strict one-to-one relationship, even though there is the same
number of schedulers as CPUs. A scheduler is bound to a CPU only when the
affinity mask is set.
This is true even if you specify that the affinity mask use
all the CPUs, which is the default setting. For example, the default Affinity
Mask Configuration value is 0, which means to use all CPUs, with no hard binding
of scheduler to CPU. In fact, in some cases when there is a heavy load on the
machine, Windows can run two schedulers on one CPU.
For
an eight-processor machine, an affinity mask value of 3 (bit string 00000011)
means that only CPUs 0 and 1 are used and two schedulers are bound to the two
CPUs. If you set the affinity mask to 255 (bit string 11111111), all the CPUs
are used, just as with the default. However, with the affinity mask set, the
eight CPUs will be bound to the eight schedulers.
In some situations, you might want to limit the
number of CPUs available but not bind a particular scheduler to a single
CPU—for example, if you are using a multiple-CPU machine for server
consolidation. Suppose that you have a 64-processor machine on which you are
running eight SQL Server instances and you want each instance to use eight of
the processors. Each instance has a different affinity mask that specifies a
different subset of the 64 processors, so you might have affinity mask values
255 (0xFF), 65280 (0xFF00), 16711680 (0xFF0000), and 4278190080 (0xFF000000).
Because the affinity mask is set, each instance has hard binding of scheduler to
CPU. If you want to limit the number of CPUs but still not constrain a
particular scheduler to running on a specific CPU, you can start SQL Server with
trace fl ag 8002. This lets you have CPUs mapped to an instance, but within the
instance, schedulers are not bound to CPUs.