Articles of pipe理员

Linux – 用pipe道“打开的文件太多”,如何debugging

我有一个Java程序运行大约3分钟后会抛出“太多打开的文件”的错误。 增加打开的文件限制是行不通的,因为它仍然用尽所有的限制,只是慢一点。 所以我的程序有问题,我需要找出答案。 这是我做的, 10970是pid 使用cat /proc/10970/fd检查Java进程的打开文件,并找出其中大部分是pipe道 使用lsof -p 10970 | grep FIFO lsof -p 10970 | grep FIFO列出所有pipe道并find大约450个pipe道 pipe道看起来像下面 java 10970服务1w FIFO 0,8 0t0 5890pipe道 java 10970服务2w FIFO 0,8 0t0 5890pipe道 java 10970服务169r FIFO 0,8 0t0 2450696pipe道 Java 10970服务201r FIFO 0,8 0t0 2450708pipe道 但是我不知道如何继续。 上面输出中的0,8表示器件编号。 我怎样才能find这些数字的设备? 更新 该程序是一个TCP服务器,并从客户端接收套接字连接并处理消息。 我有两个环境。 在生产环境中工作正常,但在testing环境中最近有这个问题。 在生产环境中,我看不到这么多的pipe道。 这两个环境的代码和基础设施是相同的,都由厨师pipe理。

在库(2)调用中禁用SIGPIPE信号

题 当写入pipe() FD时,是否可以禁止引发信号( SIGPIPE ), 而无需安装自己的信号处理程序或全局禁用/屏蔽信号? 背景 我正在创build一个偶尔创build一个pipe道的小型库,而fork()是一个等待来自父级的消息的临时子/虚拟进程。 当subprocess收到来自父进程的消息时,就会死(有意)。 问题 对于超出我的控制范围的情况,subprocess运行易于崩溃的另一个(第三方)库的代码,所以在write()到pipe道之前,我不能始终确定subprocess是活动的。 这导致我有时试图write()到subprocess'end已经死/封闭的pipe道,并在父进程中引发SIGPIPE 。 我在其他客户将要使用的图书馆 ,所以我的图书馆必须尽可能独立和透明的调用应用程序。 安装自定义信号处理程序可能会破坏客户的代码。 到目前为止工作 我已经通过使用setsockopt(…, MSG_NOSIGNAL)与套接字解决了这个问题,但我找不到任何function等同于pipe道。 我已经看了临时安装一个信号处理程序来捕获SIGPIPE ,但我没有看到任何方法来限制它的范围,而不是整个过程中的调用函数(而不是primefaces)。 我也在SO上发现了一个类似的问题,就是要求同样的事情,但是不幸的是,使用poll() / select()不会是primefaces的,并且subprocess之间的远程(但可能)我的select()和write()调用。 问题(还原) 有没有什么办法来实现我在这里尝试,或者自动检查和写入pipe道而不触发将产生SIGPIPE的行为? 此外,是否有可能实现这一点, 并知道如果儿童进程坠毁? 知道它是否崩溃让我build立供应商提供“crashy”库的情况,并让他们知道失败的频率。

mmap / munmap出现问题 – 第783次迭代后出现总线错误?

好吧,这里是设置:我在HPC工作,我们正在准备扩大到数以万计的节点的需要。 为了解决这个问题,我实现了一个本地进程caching每个节点的信息,以减lessnetworkingstream量。 然后通过共享内存公开这些信息。 基本逻辑是有一个众所周知的共享内存块,其中包含当前高速caching的表的名称。 发生更新时,caching工具将创build一个新的共享内存表,并将其填充,然后使用新表的名称更新已知块。 代码似乎是工作查找(valgrind说没有内存泄漏,例如),但是当我故意压力testing,第一个783更新工作完全正常 – 但在第784,我收到一个SIGBUS错误,当我试图写映射的内存。 如果问题是太多打开的文件(因为我泄漏文件描述符),我希望shm_open()失败。 如果问题是我正在泄漏映射内存,我希望mmap()失败或valgrind报告泄漏。 这是代码片段。 任何人都可以提供一个build议吗? int initialize_paths(writer_t *w, unsigned max_paths) { int err = 0; reader_t *r = &(w->unpublished); close_table(r,PATH_TABLE); w->max_paths = max_paths; err = open_table(r, PATH_TABLE, O_RDWR | O_CREAT, max_paths, 0); return err; } static void close_table(reader_t *r, int table) { if (r->path_table && r->path_table != MAP_FAILED) […]

适用于Linux的Mono兼容CMS

我正在寻找一个在Mono框架下运行的CMS:这需要部署在基于Linux(Ubuntu / Debian)的机器上。 有人告诉我OrchardCMS ,但它似乎不兼容。 他们也告诉我关于Umbarco ,但我还没有find任何有关兼容性的信息。 任何人都可以build议吗?

Linux中的电源pipe理通知

在基于Linux的系统中,我们可以使用哪种方法(最简单的方法)来获取电源状态更改的通知(例如,当计算机进入睡眠,hibernate等状态时)? 我主要需要这样做,是为了在睡觉前坚持一些状态,当然,一旦电脑醒来就恢复这种状态。

在Linux群集中跨机器共享大型数据文件

假设我有一个从“主”linux系统的本地安装的hdd文件系统读/写的1TB数据文件到在同一“主”系统上运行的进程的虚拟地址空间。 我有20个专用的“奴隶”linux服务器通过一个千兆交换机连接到“主”系统。 我想通过在这些“从属”服务器上随机读访问这个1TB,把它只读地写入它们的进程地址空间。 我的问题是什么是从主系统到从系统同步数据集的最有效方式(可能是懒惰的)? (例如,是否可以通过NFS挂载文件,然后从那里映射它?如果是的话,这是最好的解决scheme吗?如果不是,那么解决scheme是什么?)

NUMA内存页面迁移开销

我不得不在Linux下find与NUMA内存页面迁移相关的开销。 你能告诉我哪些工具可以使用吗? 如果可能的话,你可以举个例子。

在linux内核中,会不会打电话给kfree?

标题是相当多的问题… 我正在编写一些使用自旋锁来帮助列表pipe理的代码。 关于自旋锁的文档非常清楚,没有打电话给睡觉的任何东西。 我知道有办法分配“primefaces”的内存,但我没有看到有关kfree或释放内存的任何内容。 直觉告诉我,它不应该睡觉,但我没有发现是明确的。

防止备份读取进入Linux页面caching

AFAIK在Linux上的所有磁盘读取进入页面caching。 有没有办法阻止读取(由备份进程完成)进入页面caching? 想像: 服务器运行良好,因为大多数操作不需要触摸磁盘,因为有足够的内存可用。 现在备份过程开始,并做了大量的阅读。 读取字节进入内存(页面caching),虽然没有人想在接下来的几个小时内再次读取相同的字节。 备份数据填满了内存,caching中的更多重要页面被删除。 由于更多操作需要接触磁盘,服务器性能变差,因为相关页面已从caching中删除。 我的首选解决scheme 告诉linux,备份过程完成的读取不需要存储在页面caching中。

程序退出后,二进制文件是否保留在内存中?

我知道一个程序第一次启动的时候,由于代码不在内存中,所以在开始时就有大量的页面错误,因此需要从磁盘加载代码。 程序退出时会发生什么? 二进制文件是否留在内存中? 后续的程序调用是否会发现代码已经在内存中,因此没有页面错误(假设没有任何内容运行,页面填充到磁盘)? 在我的Linux机器上运行一些实验似乎没有答案。 我一遍又一遍地跑了一些程序,每次都观察到相同数量的页面错误。 这是一个相对安静的机器,所以我怀疑东西是调用之间的分页。 那么,为什么呢? 为什么不可执行文件留在内存中?