One implication of negotiator splitting (Consumption Policies) is that the negotiator is responsible for matching all requests. In an large-scale pool, this may make the negotiation cycle the rate-limiter for resource allocation. A pool can support multiple schedulers, so scheduler splitting (CLAIM_PARTITIONABLE_LEFTOVERS) can scale by increasing the number of schedulers running on the pool.
{section: Consumption Policies and Accounting}
-As was mentioned above, the match cost for a job against a slot with a Consumption Policy is the _change_ in the SlotWeight value from before the match to after. It is this match cost value that is added to the corresponding submitter's usage in the HTCondor accountant. A useful way to think about accounting with Consumption Policies is that the standard role of SlotWeight is replaced with _change_ in SlotWeight.
+{subsubsection: slot weights and accounting groups}
+When working with Consumption Policies, it is useful to adopt a convention where slot weight represents a measure, or estimate, of *the number of jobs that can be serviced by a slot*. For example, suppose a slot is configured with a very coarse-grained consumption policy for memory. Then memory might be your primary rate limiter:
+
+{code}CONSUMPTION_MEMORY = quantize(target.RequestMemory, {1024}){endcode}
+
+So an appropriate slot weight that measures expected jobs that could be serviced by this slot would be:
+
+{code}SLOT_WEIGHT = floor(Memory / 1024){endcode}
+
+If the slot has 4096 MB of memory, than the above policy implies that an expected 4 jobs that can be serviced (note that each job consumes at least one chunk of 1024MB).
+
+Note that job may actually acquire more than one 'chunk' of a resource. Example: if a job ends up taking 2 of the memory quanta defined above (for 2048 mem), it will reduce the partitionable slot's weight from 4 to 2. It is effectively occupying 2 "expected jobs." and it is charged a value of 2, which is deducted against its submitter share, group quota, added to submitter usage, etc.
+
+An advantage of this convention is that it allows the negotiator's matchmaking to add up the pool's slot weights to obtain a measurement of how many jobs can be serviced by all of the resources. This is especially helpful for working with Accounting Group Quotas, since it makes the one-dimensional group quota computations work smoothly with slots having different consumption policies and different slot weights, and allows compatible comparisons with running and idle jobs.
+
+{subsubsection: match cost
+The match cost for a job against a slot with a Consumption Policy is the _change_ in the SlotWeight value from before the match to after. It is this match cost value that is added to the corresponding submitter's usage in the HTCondor accountant. A useful way to think about accounting with Consumption Policies is that the standard role of SlotWeight is replaced with the change in SlotWeight.
+
+For example, consider the memory-driven consumption policy above:
+{code}
+CONSUMPTION_MEMORY = quantize(target.RequestMemory, {1024})
+SLOT_WEIGHT = floor(Memory / 1024)
+{endcode}
+
+Note that a job may acquire more than one of the "chunks" implied by the above policy. Again, assume the slot has 4096MB of memory, for an initial slot weight of 4. Suppose a job acquires 2048MB of that memory. Then the match will reduce the partitionable slot's weight from 4 to 2, for a match cost of 4-2=2. The submitter's usage will increase by 2. Effectively, the job has consumed 2 jobs' worth of that resource (recall that each job consumes at least one chunk of 1024), and is charged accordingly.
{section: Heterogeneous Resource Models}
Consumption Policies are configurable on a per-slot basis, which makes it straightforward to support multiple resource consumption models on a single pool.