Articles of Linux操作系统

Java Process的常驻内存使用量(RSS)不断增长

我们最近对我们的生产系统的观察告诉我们,我们的Java容器的常驻内存使用量增长了。 针对这个问题,我们做了一些调查,理解为什么java进程比堆栈+线程栈+共享对象+代码caching+等消耗更多的内存,使用一些本地工具,如pmap。 因此,我们发现一些由本地进程(可能是使用malloc / mmap)分配的64M内存块(成对): 0000000000400000 4K rx– /usr/java/jdk1.7.0_17/bin/java 0000000000600000 4K rw— /usr/java/jdk1.7.0_17/bin/java 0000000001d39000 4108K rw— [ anon ] 0000000710000000 96000K rw— [ anon ] 0000000715dc0000 39104K —– [ anon ] 00000007183f0000 127040K rw— [ anon ] 0000000720000000 3670016K rw— [ anon ] 00007fe930000000 62876K rw— [ anon ] 00007fe933d67000 2660K —– [ anon ] […]

C ++标准库和Boehm垃圾收集器

我想在Linux / AMD64 / Debian上用GCC 4.6开发一个multithreading的C ++应用程序(最终大部分的C ++代码将由应用程序本身生成,可以被视为一种高级的域特定语言)可能是最新的C ++ 11标准)。 我真的想用Boehm的保守的垃圾收集器来分配所有的堆,因为我想用new(GC)分配,而且从不打扰delete 。 我假设Boehm的GC工作得很好。 使用C ++(而不是C)的主要动机是C ++标准库提供的所有algorithm和集合std::map … std::vector 。 Boehm的GC提供了一个gc_allocator<T>模板(在其文件gc / gc_allocator.h中)。 我应该重新定义operator ::new作为Boehm的吗? 或者我应该使用显式的分配器模板参数设置为一些gc_allocator所有集合模板? 我不明白第二个模板参数(分配器)对std :: vector的作用吗? 是用来分配vector内部数据还是分配每个单独的元素? 那么std::string -s呢? 如何使他们的数据GC分配? 我应该有我自己的string,使用basic_string模板与gc_allocator ? 有没有办法让GC_malloc_atomic而不是GC_malloc分配的char内部数组? 或者你build议不要使用Boehm GC与g ++编译的应用程序? 问候。

listen()忽略积压参数?

我有以下问题: 我有sockfd = socket(AF_INET, SOCK_STREAM, 0) 当我build立并绑定套接字(比如sockfd.sin_port = htons(666) )后,我立刻做了: listen(sockfd, 3); sleep(50); // for test purposes 我睡了50秒来testingbacklog参数,这似乎被忽略了,因为我可以在端口666上build立超过3次的连接。 *:我的意思是,我从每个从客户端发送的第N个SYN(n> 3)获得一个syn / ack,并放入监听队列中,而不是被丢弃。 什么可能是错的? 我读过listen(2)和tcp(7)的man页面,发现: Linux套接字上的backlog参数的行为随Linux 2.2而改变。 现在它指定了等待被接受的完全build立的套接字的队列长度,而不是不完整的连接请求的数目。 不完整套接字队列的最大长度可以使用/ proc / sys / net / ipv4 / tcp_max_syn_backlog来设置。 当启用syncookies时,没有逻辑最大长度,这个设置被忽略。 有关更多信息,请参阅tcp(7)。 ,但即使使用sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2和sysctl -w net.ipv4.tcp_syncookies=0 ,我仍然得到相同的结果! 我一定是错过了一些东西,或者完全误解了listen()的积压目的。

如何等待非subprocess退出

对于subprocess,可以使用wait()和waitpid()函数暂停当前进程的执行,直到subprocess退出。 但是这个函数不能用于非subprocess。 是否还有另一个function,可以等待任何进程退出?

awk模式可以匹配多行吗?

我有一些复杂的日志文件,我需要编写一些工具来处理它们。 我一直在玩awk,但我不确定awk是否是正确的工具。 我的日志文件是OSPF协议解码的打印输出,其中包含各种协议包的文本日志及其内容,以及用它们的值标识的各种协议字段。 我想处理这些文件,只打印出与特定pkts有关的日志的某些行。 每个pkt日志可以包含该pkt条目的不同数量的行。 awk似乎能够处理与模式匹配的单行。 我可以find所需的pkt,但然后我需要匹配下面的行中的模式,以确定它是否是我想要打印的pkt。 另一种方法来看待这个问题,我想隔离日志文件中的几行,并根据几行模式匹配打印出特定pkt的细节。 由于awk似乎是基于行的,我不确定这是否是最好的工具。 如果awk可以做到这一点,它是如何做到的? 如果没有,有哪些工具可以使用这个build议?

在同一个端口上接收多个多点传送 – C,Linux

我有一个应用程序从同一端口上的多个多播源接收数据。 我能够收到数据。 但是,我正在考虑每个组的统计信息(即收到的消息,收到的字节),所有的数据都混在一起。 有谁知道如何解决这个问题? 如果我试图查看发件人的地址,它不是多播地址,而是发送机器的IP地址。 我正在使用以下套接字选项: struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr("224.1.2.3"); mreq.imr_interface.s_addr = INADDR_ANY; setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 并且: setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse)); 我感谢任何帮助!