每次将邮件加入通道队列时,作业控制器将确保存有一个运行的作业,用于传送邮件。这可能涉及启动一个新作业进程、添加一个线程或只是通知一个作业已经在运行。但是,单个服务作业可能不足以确保所有邮件的及时传送。(有关作业控制器的概念和配置的更多信息,请参阅作业控制器文件、用于通道执行作业的处理池和作业控制器。)
对于任何给定安装,都存在一个合理的为传送邮件而启动的进程和线程的最大数量。该最大数量取决于诸如处理器的数量、磁盘的速度以及连接的特性等因素。在 MTA 配置中,可以控制以下内容:
为给定通道启动运行的最大进程数(maxjobs 通道关键字)
启动新线程或新进程之前接收的排队邮件的数量(threaddepth 通道关键字)
为给定通道启动运行的最大进程数是通道中 maxjobs 设置的最小值,也是通道在其中运行的池的 JOB_LIMIT 设置的最小值。
假定需要处理一个邮件。通常作业控制器按照以下方法启动新进程:
如果不存在为通道运行的进程,而且未达到池作业限制,则作业控制器将启动新进程。
如果通道程序是单线程的,或者已经达到线程限制,并且待办事项增加到超过多个线程(由 threaddepth 指定),而通道和池作业限制均未达到,则作业控制器将启动新进程。
如果通道程序是多线程的,未达到线程限制,而待处理邮件增加到超过多个 threaddepth,则启动新线程。
特定于 SMTP 通道而言,当邮件加入不同主机的队列时,将启动新线程或新进程。因此,对于 SMTP 通道,作业控制器按照以下方法启动新进程。假定需要处理一个邮件,将进行以下操作:
如果不存在为 SMTP 通道运行的进程,并且未达到池限制,则作业控制器将启动新进程。
如果已经达到线程限制 (MAX_CLIENT_THREADS),邮件加入未被服务的主机队列,而且通道限制 (maxjobs) 和池作业限制 (JOB_LIMIT) 均未达到,则启动新进程。
如果未达到线程限制,邮件加入未被服务的主机队列,则启动新线程。
如果未达到线程限制,而加入队列的邮件使该主机的待处理邮件增加到超过多个 threaddepth,则启动新线程。
另请参见SMTP 通道线程。
filesperjob 关键字可用于使 MTA 创建附加服务作业。该关键字使用一个正整数参数,指定必须将多少队列条目(即文件)发送到关联的通道之后才能创建一个以上的服务作业用以处理队列条目。如果给定的值小于或等于零,则被解释为请求仅加入一个服务作业。不指定关键字等效于指定零。该关键字的效果将被最大化;计算的较大数量为实际创建的服务作业的数量。
filesperjob 关键字按给定值划分实际队列条目或文件的数量。请注意,给定邮件产生的队列条目的数量由许多因素控制,包括但不仅限于关键字 single 和 single_sys 的使用以及邮件列表中标题修改操作的规范。
maxjobs 关键字对于可以同时运行的服务作业的总数设置了上限。此关键字后面必须跟一个整数值,如果计算的服务作业的数量大于该值,则实际只创建 maxjobs 作业。如果未指定 maxjobs,则默认值为 100。通常将 maxjobs 值设置为小于或等于可以在任意服务池或通道使用的池中同时运行的作业的总数。