到目前为止,我从事嵌入式系统和硬件接口的系统编程工作。为了获得乐趣和个人知识,在接触了Erlang之后,我最近一直在尝试学习更多关于服务器编程的知识。我一直从C++/Java的角度考虑服务器,现在我想知道如何使用C++或Java这样的技术来构建可伸缩的系统。
我读到,由于上下文切换和有限的内存,每个客户端的线程处理程序是不现实的。通常会创建一个线程池,并混合使用工作线程和异步I/O来处理请求。我想知道,首先,如何确定线程池的大小?人们仅仅需要测量并找到最佳平衡吗?最终,随着系统的扩展,可能需要不止一台服务器来处理请求。如何跨多个服务器管理请求来处理大型客户群?
我只是在寻找一些方向,在哪里我可以读更多的书,并找到我的问题的答案。我应该在计算机科学的哪个领域寻找这方面的更多信息?对于这个计算领域,有没有什么设计模式?
发布于 2009-04-18 04:00:33
对于C++,我使用的是boost::asio,它是非常现代的C++,使用起来非常方便。此外,C++0x网络库将基于ASIO的实现,因此它是有价值的知识。
对于每个客户端1线程的设计,正如你已经了解的那样,它不起作用。对于高性能多线程,最好的线程数量似乎是CoresX2,但对于服务器,每个请求都有大量的IO,这意味着大量的空闲等待。从经验上看,Apache、MySQL和Oracle的线程数量与数据库服务器的CoresX10和web服务器的CoresX40有关,并不是说这些是理想的,但它们似乎是成功系统的模式,所以如果您的系统能够平衡,以便以类似的数量最佳地工作,至少您将知道您的设计不是完全糟糕的。
发布于 2009-04-18 02:06:55
你的问题太笼统了,没有一个好的答案。答案在很大程度上取决于上下文,任何一个线程处理了多少,请求到达的速度有多快,使用的CPU系列,使用的web容器,以及许多其他因素。
发布于 2009-04-18 02:17:20
C++ Network Programming: Mastering Complexity Using ACE and Patterns和C++ Network Programming: Systematic Reuse with ACE and Frameworks是非常好的书籍,它们描述了许多设计模式以及它们在高度可移植的ACE库中的使用。
https://stackoverflow.com/questions/762736
复制相似问题