Articles of asynchronous

libmemcached – memcached_mget似乎阻塞

我有一个单一的memcached服务器。 我使用libmemcached C api来连接它。 我正在使用非阻塞模式和没有应答模式(行为标志)。 如果有帮助,我也在nginx C模块中使用libmemcached。 问题是,memcached_mget似乎阻塞,即对于具有大约40ms的延迟的服务器,memcached_mget需要40ms来完成。 这不完全是asynchronous的。 这是我正在使用的代码: const char* localKeys[2] = {"key1", "key2"}; size_t k_length[2] = {4, 4}; gettimeofday(&t1, NULL); ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no block: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK)); ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no reply: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY)); retFt = memcached_mget(memc, localKeys, k_length, 2); gettimeofday(&t2, NULL); ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0, "memcached_mget duration (microseconds): […]

一个单线程的NGINX如何处理这么多的连接?

NGNIX使用epoll通知来了解套接字上是否有数据要读取。 假设:有两个请求到服务器。 nginx注意到这两个请求,并开始: 接收第一个请求 parsingist头 检查badary(体型) 发送第一个请求到上游服务器 等等 nginx是单线程的,只能同时执行一个操作。 但是第二个请求会发生什么? 在parsing第一个请求时,nginx是否收到第二个请求? 或者在第一次完成后开始处理第二个请求? 或者其他我不明白的东西。 如果1.是正确的,我不明白如何在一个单一的线程内是可能的。 如果2.是正确的,nginx怎么会这么快? 因为nginx按顺序处理所有传入的请求。 在任何时候,只有一个请求处理是可能的。 请帮我理解。 谢谢

作为事件驱动的服务器,为什么Node.js需要Nginx不支持的asynchronous代码?

问题在于标题。 换句话说,如果Nginx作为node.js的相同事件驱动的asynchronousIO模型工作,为什么不需要编写asynchronous样式代码呢? 我知道,Nginx实际上并没有执行任何代码,而是代之以谁可以。 那为什么不节点呢? 我们错过了现在的Ngninx方式吗? 或者,从节点获得更多(除了编写asynchronous代码的痛苦之外)? PS。 更具体的说,Nginx + php-fpm或者Nginx + wsgi + python / ruby​​单独关于节点性能还是利用节点声称的计算资源有什么不同? 无法节点只使用现有的FastCGI模型,做一个同步风格的JavaScript解释器,让networking服务器做它的asynchronous工作?

为什么Apache Event MPMperformance不佳?

Event MPM的devise与Nginx不完全相同,但它的devise明显是为了使Keepalive更加稳定,并能更快地发送静态文件。 我的理解是Event MPM是一个误用,因为: 虽然连接传递给kqueue / epoll, 某些非常重要的模块(如mod_gzip和mod_ssl)会阻塞/消耗一个线程,直到完成响应, 这是大文件的问题,但可能不适用于PHP生成的HTML文档等。 不幸的是,阿帕奇不断失去市场份额,而大多数基准都在为MPM事件蒙上阴影。 基准是有缺陷的,还是事件MPM真的对Nginx不好? 即使有这些限制,在正常stream量(非恶意)和较小的文件下,它应该与Nginx有点竞争。 例如,它应该是有竞争力的,通过慢速连接的php-fpm服务PHP生成的文档,因为文档将被缓冲(即使是ssl'd和gzip'd)并被asynchronous发送。 无论使用压缩还是不使用压缩的SSL和非SSL连接都不应该像Nginx那样在工作负载上有明显的不同。 那么为什么它不会在各种基准testing中出现呢? 它出什么问题了? 或者基准testing有什么问题? 是一个主要的网站使用它作为一个吸引力,它可以执行的权力?

是否有一种阅读Linux上目录列表的asynchronous信号安全的方式?

SUSv4在其asynchronous信号安全函数列表中没有列出opendir,readdir,closedir等。 有没有一种安全的方法来从信号处理程序中读取目录列表? 例如是否有可能“打开”目录,并以某种方式sl出原始目录列表? 如果是这样的话,“读”返回什么样的数据结构? 或者,也许在Linux上,即使SUSv4 / POSIX不需要可以使用的某些系统调用也是asynchronous信号安全的。

以asynchronous模式读取Linux串口

我在Linux系统中从串口读取数据时遇到了麻烦。 我正在尝试通过使用UART连接一个传感器与Linux系统。 我可以读写/ deve / ttyS1。 但问题是,我不想轮询来自UART的消息。 相反,我想使用asynchronous模式来获取数据。 随着数据的到来,callback函数将进入一个特定的例程并运行我的代码。 问题不在于传感器向我发送不同的数据包,而是每个数据包含各种字节的数据。 他们每一秒都来! 例如: Time Sensor MyLinux 1s 50bytes 124bytes 2s 40bytes 174bytes 3s 60bytes 244bytes 我的问题是如何使用asynchronous串行编程,以便在callback函数中,这两个数据包可以被读取为两个消息 说50个字节来了,回拨function可以让我读50个字节127个字节来,回拨function可以让我读127个字节 现在,它有50个字节,我只能读取27个字节,剩下的23个在下一个消息中。 我在POSIX中的串口设置是: /* now we setup the values in port's termios */ serial->tio.c_cflag=baudrate|databits|checkparity|stopbits|CLOCAL|CREAD; serial->tio.c_iflag=IGNPAR; serial->tio.c_oflag=0; serial->tio.c_lflag=0; serial->tio.c_cc[VMIN]=28; serial->tio.c_cc[VTIME]=6; /* we flush the port */ tcflush(serial->fd,TCOFLUSH); tcflush(serial->fd,TCIFLUSH); /* we send […]

等待infiniband在Linux上完成的最佳方式?

我们正在移植Isis2(isis2.codeplex.com)以更好地使用Infiniband动词,并让我们的代码运行。 然而,IB是围绕一个asynchronous接收模型来定位的,在这个模型中,您发布了一堆接收缓冲区,然后在接收完成时处理接收到的数据。 轮询很慢:如果我使用阻塞等待,比如说2ms,那么在查看IB数据之前,我可能会延迟2ms。 所以这是一个解决scheme,但是一个穷人。 我真正想要的是一种等待IB完成logging完成的方法,然后让我的线程立即唤醒(在Windows上,这很容易…在Linux上它不是那么自然)。 有谁知道这是如何做的? 当使用动词时,没有任何IB文件描述符,所以显然我不能使用select()

如何在实时Linux应用程序中logging数据?

我正在使用4.4.12-rt19 RTLinux内核补丁。 我有一个用C编写的实时应用程序,它有单独的进程运行在独立的核心上,从networking获取数据,计算这些数据,然后logging结果。 我试图login的数据文件的每个时钟滴答的10KB的顺序。 日志logging过程可以访问共享内存中的所有传入数据。 现在,我正在使用sqlite3和sqlite3async将数据库caching到logging过程的一个线程中的内存,然后通过调用sqlite3async_run()将内存中的实例提交到文件中。 问题是,在sqlite3async_run()执行的一部分期间,写入内存数据库缓冲区的sqlite3_step()命令挂起并违反了我的1ms时间保证。 我不确定是否因为线程进程在实时环境中工作或者sqlite3async如何工作而发生错误。 据我所知,sqlite3async应该能够使用sqlite3虚拟文件系统在内存中缓冲数据库,然后用后台线程处理实际的文件写入(详见此处 )。 我试图改变每个线程的调度优先级和好处无济于事。 任何帮助或build议将不胜感激!

POSIX AIO:将完成通知关联到原始请求的任何(好)方法?

我是否认为AIO完成通知(不pipe是通过线程还是信号完成的)不会告诉您哪个请求已经完成? 除了为每个请求调用单独的callback函数外,还有什么办法可以完成这种关联吗? 表面上,您可以使用原始请求的aiocb结构来调用aio_error和aio_return,但是您不会将指针作为通知callback的一部分返回给aiocb结构。 为什么似乎没有这样做的机制?

Block Layer中重复的LBA请求

我正在使用blktrace来了解具有较高IO负载的multithreadingIO工作负载中的块层行为。 我可以在块层中观察到一些重复的LBA请求。 例如,在原始工作负载中,我只有一个写入请求到LBA 47568。 不过,blktrace显示了写LBA 47568的121个请求! 下面是blkparse日志的一部分,它只过滤I事件(IO插入请求队列)。 我想了解为什么发生这种现象,我怎么能消除这种现象。 我在/ sys / block / sdX / nomerge中select了IO调度程序和值2来避免IO合并。 我非常感谢你的帮助。 8 240 0 7539 0.073300123 32282 I WS 47576 + 8 [a] 8 240 5 4462 0.073303974 32281 I WS 47568 + 8 [a] 8 240 11 4462 0.073306337 32283 I WS 47584 + 8 [a] 8 240 […]