相关疑难解决方法(0)

TCP/IP - 使用每个客户端的线程方法解决C10K

在阅读着名的C10k文章并在网上搜索自编写之后事情如何演变之后,我想知道今天的标准服务器是否有可能使用每个连接的线程处理> 10000个并发连接(可能与一个线程池的帮助,以避免创建/终止进程).


一些可能影响问题解决方法的细节:

  1. 输入,中间处理和输出.
  2. 每个连接的长度.
  3. 服务器的技术规格(核心,处理器,RAM等......)
  4. 将此系统与AIO,轮询,绿色线程等替代技术相结合......

显然我不是这方面的专家,所以任何评论或建议都将受到高度赞赏:)

concurrency multithreading tcp c10k

32
推荐指数
3
解决办法
1万
查看次数

Linux上真的没有异步块I/O吗?

考虑一个受CPU限制的应用程序,但也具有高性能I/O要求.

我正在将Linux文件I/O与Windows进行比较,我看不出epoll将如何帮助Linux程序.内核会告诉我文件描述符"准备好读取",但是我仍然需要调用阻塞read()来获取我的数据,如果我想读取兆字节,那么很明显它会阻塞.

在Windows上,我可以创建一个设置了OVERLAPPED的文件句柄,然后使用非阻塞I/O,并在I/O完成时收到通知,并使用该完成函数中的数据.我需要不花费应用程序级别的挂钟时间等待数据,这意味着我可以精确地将我的线程数调整为我的内核数量,并获得100%的高效CPU利用率.

如果我必须在Linux上模拟异步I/O,那么我必须分配一些线程来执行此操作,并且这些线程将花费一些时间来处理CPU事务,并且大量时间阻塞I/O,此外,在这些线程的消息传递中会有开销.因此,我将过度订阅或利用我的CPU核心.

我把mmap()+ madvise()(WILLNEED)视为"穷人的异步I/O",但它仍然没有完全通过那里,因为当它完成时我无法得到通知 - 我有"猜测",如果我猜"错误",我将最终阻止内存访问,等待数据来自磁盘.

Linux似乎在io_submit中启动了异步I/O,它似乎也有一个用户空间POSIX aio实现,但它已经有一段时间了,我知道没有人会担保这些系统的关键,高性能的应用程序.

Windows模型的工作方式大致如下:

  1. 发出异步操作.
  2. 将异步操作绑定到特定的I/O完成端口.
  3. 等待该端口上的操作完成
  4. 当I/O完成时,等待端口的线程解除阻塞,并返回对挂起的I/O操作的引用.

步骤1/2通常作为单个事物完成.步骤3/4通常使用工作线程池完成,而不是(必要)与发出I/O相同的线程.这个模型有点类似于boost :: asio提供的模型,除了boost :: asio实际上不会给你异步的基于块的(磁盘)I/O.

Linux中epoll的不同之处在于,在步骤4中,还没有I/O发生 - 它会在步骤4之后提升第1步,如果你确切知道你需要的话,那就是"向后".

编写了大量的嵌入式,桌面和服务器操作系统之后,我可以说这种异步I/O模型对于某些类型的程序来说非常自然.它还具有非常高的吞吐量和低开销.我认为这是Linux I/O模型在API级别上仍然存在的真正缺点之一.

linux posix asynchronous overlapped-io

25
推荐指数
3
解决办法
1万
查看次数

C中的事件驱动模型

我对C中的事件驱动编程非常感兴趣,特别是对于套接字,所以我将花一些时间来做我的研究.

让我们假设我想构建一个包含很多文件和网络I/O的程序,比如客户端/服务器应用程序,基本上第一个问题是这个模型背后的哲学是什么.在正常编程中,我会生成新进程,为什么单个进程实际上可以为许多其他请求提供服务.例如,有一些Web服务器可以处理连接而无需创建线程或其他进程,只需一个主要进程.

我知道这很复杂但至少知道这种编程的基础设施是多么好.

c unix linux operating-system event-driven

17
推荐指数
2
解决办法
3万
查看次数

Ubuntu Linux中的异步IO io_submit延迟

我正在寻找有关如何为我在Ubuntu Linux 14.04上运行的应用程序提供高效和高性能异步IO的建议.

我的应用程序处理事务并在磁盘/闪存上创建文件.当应用程序正在进行事务处理时,会创建必须附加到磁盘/闪存上的文件的附加块.应用程序还需要在处理新事务时频繁读取此文件的块.除了还要创建必须附加到此文件的新块之外,每个事务可能还需要从该文件中读取不同的块.有一个传入的事务队列,应用程序可以继续处理队列中的事务,以创建足够深的IO操作管道,以隐藏读取访问的延迟或磁盘或闪存上的写入完成.对于尚未写入磁盘/闪存的块(由先前事务放入写入队列)的读取,应用程序将停止,直到相应的写入完成.

我有一个重要的性能目标 - 应用程序应该产生尽可能低的发布IO操作的延迟.我的应用程序大约需要10微秒来处理每个事务,并准备对磁盘/闪存上的文件发出写入或读取.发出异步读取或写入的额外延迟应尽可能小,以便应用程序可以在每次事务处理时尽可能接近10个usecs,只需要进行文件写入时完成每个事务的处理.

我们正在尝试使用io_submit发出写入和读取请求的实现.我将不胜感激任何有关我们要求的最佳方法的建议或反馈.io_submit会给我们最好的表现以达到我们的目标吗?我应该期望每个写入io_submit的延迟和每个读取io_submit的延迟?

使用我们的实验代码(在2.3 GHz Haswell Macbook Pro,Ubuntu Linux 14.04上运行),我们在扩展输出文件时测量写入io_submit大约50个usecs.这太长了,我们甚至没有接近我们的性能要求.任何帮助我以最小延迟启动写请求的指南都将非常感激.

linux performance latency aio

4
推荐指数
2
解决办法
2142
查看次数