内核说它可以支持最多 32768 个进程 id /proc/sys/kernel/pid_max
,但我的服务器可以同时处理多少个进程而不会抱怨资源或挂起我的服务器,
我知道这取决于每个过程的行为和资源需求,但是是否存在某种包含一些参数的方程式,例如 Ram、缓存、CPU 核心……等等?
编辑:
我的服务器托管在 Linode 上,规格如下:
RAM: 12 GB
CPU: Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz
cpu MHz : 2499.970
cache size : 4096 KB
Cores: 6 cores
我的服务器上有一些运行我的应用程序的旧版本,
Apache 2.2
mysql 5.5
php 5.3
php5-fpm
答案1
有一个公式可以计算最大活动 PID 或线程数。摘自kernel/fork.c
:
/*
* set_max_threads
*/
static void set_max_threads(unsigned int max_threads_suggested)
{
u64 threads;
/*
* The number of threads shall be limited such that the thread
* structures may only consume a small part of the available memory.
*/
if (fls64(totalram_pages) + fls64(PAGE_SIZE) > 64)
threads = MAX_THREADS;
else
threads = div64_u64((u64) totalram_pages * (u64) PAGE_SIZE,
(u64) THREAD_SIZE * 8UL);
if (threads > max_threads_suggested)
threads = max_threads_suggested;
max_threads = clamp_t(u64, threads, MIN_THREADS, MAX_THREADS);
}
但是,通常其他限制会先被满足。如果 RAM 和其他资源最后满足,那么一些 cgroup限制可能首先出现,其基本限制是:
$ cat /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max
12288
在我旧的 3 GB 服务器和新的 16 GB 服务器上,数字 12288 是相同的。
我可以通过尝试旋转出大于最大数字来进行测试,结果显示一条消息/var/log/kern.log
:
Feb 12 15:49:11 s15 kernel: [ 135.742278] cgroup: fork rejected by pids controller in /user.slice/user-1000.slice
检查一下我当时的号码:
$ cat /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.current
12287
top
提到了 12479
但这些过程结束后,我得到了:
$ cat /sys/fs/cgroup/pids/user.slice/pids.current
15
top
约 205,并注意:12479 - 205 + 15 = 12289
答案2
答案可能是数千、数百或数十。这取决于计算机的资源以及进程实际执行的操作。
您能做的最好的事情就是运行您的服务器,研究资源并根据服务器的使用情况增加资源。
资源在很大程度上取决于计算机的速度和内存。内存允许在内存中处理更多进程,而速度允许快速处理任务,然后进入下一个进程。
如果您的系统负载为 1.00(可以通过top
从命令行运行来检查),那么它基本上是在完全协同运行。任何超过该值的情况都是溢出,计算机正在努力跟上。当然,如果负载过高,它可能需要很长时间才能赶上,以至于它基本上会被锁定。
顺便说一下,1.00 是每个处理器的。因此,如果您有 4 核处理器,负载在 4.00 时就会达到满负荷。
请参阅本文以了解有关负载的更多详细信息:
http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages
因此,您必须使用以下应用程序来实际研究负载顶部衡量运行您所考虑的服务器类型和流量所需的资源。
答案3
没有其他答案,除了依靠。
该进程做什么?休眠,等待某事,同时不消耗 RAM?然后您可以运行 32768 个进程。它运行巨大的数据库表吗?那么少得多。
此外,这取决于您的硬件。四插槽 10 核 Xeon 将比 Raspberry 处理更高的负载……
我的笔记本电脑有 266 个进程,负载为 0.66,表明大多数进程处于休眠状态。