每次郵件在通道中排入佇列時,工作控制器均可確保會有一項遞送郵件的工作正在執行中。這可能涉及到啟動新的工作程序、新增執行緒或只指明工作已在執行中。但是,單一服務工作可能不足以確保及時遞送所有的郵件。(如需有關工作控制器概念和配置的詳細資訊,請參閱10.4.8 工作控制器檔案、12.5.4 通道執行工作的處理區和8.7 工作控制器)。
對於任何指定的安裝都會啟動合理的最大數量的程序與執行緒以遞送郵件。此最大數量取決於幾個因素,例如處理器的數量、磁碟的速度和連線的特徵。在 MTA 配置中,可以控制以下內容:
為執行指定通道而啟動的程序之最大數目 (maxjobs 通道關鍵字)
新執行緒或程序啟動之前,接收到的已排入佇列的郵件之數量 (threaddepth 通道關鍵字)
對於某些通道而言,將在指定遞送程式中執行的執行緒最大數 (通道選項檔案中的 max_client_threads 參數)
為執行指定通道而啟動的程序之最大數,是對通道設定的 maxjobs 和通道執行所在的處理區設定之 JOB_LIMIT 最小值。
假定有一封郵件需要處理。通常,工作控制器會啟動新的程序詳情如下:
如果沒有為通道執行的程序,並且尚未達到處理區工作限制,則工作控制器會啟動新的程序。
如果通道程式是單執行緒或已達到執行緒限制,而儲存區增加量超過了執行緒的一倍 (透過 threaddepth 指定),且通道與處理區工作限制均未達到,則工作控制器會啟動新的程序。
如果通道程式是多重執行緒並且尚未達到執行緒限制,而郵件的儲存區增加量超過了 threaddepth 的一倍,則會啟動新的執行緒。
尤其對於 SMTP 通道,新的執行緒或程序會在不同主機的郵件排入佇列時啟動。因此,對於 SMTP 通道,工作控制器會啟動新的程序,詳情如下。假定有一封郵件需要處理:
如果沒有為 SMTP 通道執行的程序,並且尚未達到處理區限制,則工作控制器會啟動新的程序。
如果已達到執行緒限制 (MAX_CLIENT_THREADS),某個尚未獲得服務的主機之郵件將會排入佇列,且通道 (maxjobs) 和處理區工作限制 (JOB_LIMIT) 均尚未達到,則將啟動新的程序。
如果尚未達到執行緒限制,某個尚未獲得服務的主機之郵件已排入佇列,則會啟動新的執行緒。
如果尚未達到執行緒限制,而郵件已排入佇列,使相應主機的郵件儲存區增加量超過了 threaddepth 的一倍,則會啟動新的執行緒。
filesperjob 關鍵字可用於使 MTA 建立其他服務工作。此關鍵字接受單一正整數參數,指定在處理佇列項目 (即檔案) 的多個服務工作建立之前,有多少個佇列項目必須傳送至關聯的通道。如果此值小於或等於零,則表示佇列只請求一個服務工作。不指定關鍵字就相當於指定零值。此關鍵字的效果已經最大化;較大的估算數量將是實際建立的服務工作數量。
filesperjob 關鍵字會以實際佇列項目或檔案的數目除以指定值。請注意,指定郵件所產生的佇列項目之數目由多個因素所控制,包括但不僅限於 single 和 single_sys 關鍵字的使用,以及郵遞清單中標頭修改動作的規格。
maxjobs 關鍵字對可並行執行的服務工作之總數設定了一個上限。此關鍵字之後必須加整數值;即使服務工作的估算數目大於此值,實際上仍只會建立 maxjobs 數目的工作。如果未指定 maxjobs,則此值預設為 100。通常,maxjobs 的設定值應小於或等於通道使用的任何服務處理區中可同時執行的工作之總數。