我正在从Windows切换到Linux开发,并且非常喜欢它。 什么是贡献给内核的最佳方式。 我非常stream利的C和C ++,特别是有兴趣参与线程。 任何指针将不胜感激!
编辑 :更详细的答案在这里: https : //serverfault.com/questions/454192/my-linux-server-number-of-processes-created-and-context-switches-are-growing 我在我的服务器有一个奇怪的行为: – /。 是一个VPS。 当我做cat /proc/stat ,我可以看到每秒如何创build50-100个进程,并发生大约800k-1200k的上下文切换! 所有的信息是与服务器完全空闲,没有stream量,也没有程序运行。 顶部显示0平均负载和100%闲置的CPU。 我closures了所有不需要的服务(httpd,mysqld,sendmail,nagios,命名…),问题依然存在。 我也ps -ALf都做ps -ALf ,但是我没有看到任何改变,每次只创build一个新的ps进程,PID与之前的+ 1一样,所以不会创build新进程,所以我认为这个进程在cat /proc/stat增长必须是线程(是的,似乎/proc/stat中的processes计数线程创build也是这样: http : /proc/stat : www.linuxhowtos .org / System / procstat.htm&hl = es&tbo = d&gl = es&strip = 1 )。 我已经更改为/proc目录,完成cat [PID]\status与所有列出的ls (包括内核的),并在任何进程的nonvoluntary_ctxt_switches也nonvoluntary_ctxt_switches增长速度与cat /proc/stat相同(只是一个几十个/秒)。 我已经对所有进程执行了strace -p PID ,所以我可以看到是否有进程在创build线程或其他东西,但是有一点移动的唯一进程是ssh并且由于数据正在发送,移动是read / write操作到我的terminal。 在那之后,我做了vmstat -s ,看到forks在/proc/stat中的速度相同。 正如http://linux.die.net/man/2/fork所说,每个fork()都会创build一个新的PID,但是我的服务器PID不会增长! 我能想到的最后一件事情是proc/stat和vmstat […]
我想在特定的外部进程的所有线程上设置SCHED_RR(和优先级)。 最好的办法是从shell和另外一个案例中做到这一点 – 从小时候创build它的过程中编程地从另一个过程中执行。 谢谢! 我吮吸shell脚本,并不知道如何为一个进程的所有线程运行“chrt”,以防万一,线程有不同的名字。
我必须从15个不同的客户端接收数据,每个客户端在5个不同的端口上发送。 共15 * 5个sockets。 为每个客户端口定义和修复。 例如客户端1,端口3001至3005.客户端2,端口3051至3055等。它们有一个共同点,即第一端口(3001,3051)用于发送命令。 其他端口发送一些数据。 收到数据后,我必须检查校验和。 跟踪recvd数据包,重新请求数据包,如果丢失,还必须写入硬盘上的文件。 限制我不能改变上面的devise,我不能从UDP更改为TCP。 阅读后我知道的两种方法是 asynchronous复用使用select()。 每个套接字线程。 我尝试了第一个,当我得到数据时,我被卡住了。 我能够接收数据。 我有一些处理这样做,我想启动一个线程为每个套接字(或)为套接字来处理(说所有第一个端口,所有第二等..ie3001,3051等)但是,如果客户端发送任何数据然后FD_ISSET成为真的,所以如果我开始一个线程,那么它成为每个消息的线程。 问题:如何在这里添加线程代码,说如果我包含pthread_create if(FD_ISSET ..)然后为我收到的每个消息,我创build一个线程。 但是我想要每个插槽的线程。 while(1) { int nready=0; read_set = active_set; if((nready = select(fdmax+1,&read_set,NULL,NULL,NULL)) == -1) { printf("Select Errpr\n"); perror("select"); exit(EXIT_FAILURE); } printf("number of ready desc=%d\n",nready); for(index=1;index <= 15*5;index++) { if(FD_ISSET(sock_fd[index],&read_fd_set)) { rc = recvfrom(sock_fd[index],clientmsgInfo,MSG_SIZE,0, (struct sockaddr *)&client_sockaddr_in, &sockaddr_in_length); […]
我想在multithreading程序中使用ppoll或pselect。 根据手册页( ppoll , pselect ),它们之间有显着的区别 – ppol被认为是使用(或者像使用sigprocmask一样),pselect使用pthread_sigmask。 而在sigprocmask手册页上是信息“在multithreading进程中未指定使用sigprocmask();请参阅pthread_sigmask(3)”。 这是否意味着,我必须使用pselect,而不是ppoll? 真的有区别,还是只有男人的差异/错误/不准确? 我刚刚发现,在我的系统的手册页中,pselect和ppoll都被描述为使用等价于sigprocmask。 pselect还是仅仅在人中有区别?
我有一些服务器,我们运行很多东西。 他们已经经常承受太多的负载,并容易崩溃。 我有一个Ruby程序,是另一个Ruby程序的包装。 包装派生出一个线程,该线程运行主要的Ruby脚本,调用另一个可能需要10-20秒才能返回响应的服务,所以不会主动处理。 它为每个参数都这样做,所以在最坏的情况下,它一次只能做60个。 我不认为这会引起很大的问题,因为线程毕竟在等待IO,但是创build60个线程运行另一个Ruby脚本似乎正在付出代价,通常会超时或者超时服务器。 我猜那里有一些开销? 也许我没有考虑到Linux必须在每个bash和Ruby实例内部做什么? 我会认为自己是一个Linux新手,因为很多内部对我来说仍然是魔术。 有人可以解释为什么我的方法是愚蠢的,我会更好地限制自己10线程或在我的循环创造线程的第二个延迟? 在创buildbash环境以在Ruby中运行外部命令时有多less开销? 为了减less这种开销,我会不会更好地用几个命令创build命令? 提前致谢
我试图实施一个范围守卫类,并遇到了Linux上取消点的问题。 从我发现的情况来看,Linux在exception情况下实现了pthread取消,其中exception不能在用户的catch块中处理(即必须重新抛出)。 这导致下面的示波器防护实现的问题,试图忽略其相关函数可能抛出的任何exception: #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <functional> struct scope_guard { template <typename T> scope_guard(T func) : function_(func) {} ~scope_guard() { try { function_(); } catch (…) {} } std::function<void()> function_; }; extern "C" { void* thread_func(void*) { try { scope_guard guard( [](void) { // wait for a cancellation event while (true) […]
Ubuntu 12.04 LTS java -version java版本“1.6.0_38” Java(TM)SE运行时环境(build 1.6.0_38-b05) Java HotSpot(TM)64位服务器虚拟机(构build20.13-b02,混合模式) 4核心CPU – 一些戴尔服务器硬件 不时有10个线程在数分钟内运行一个“繁重”的工作。 在其他时期,他们什么都不做。 1线程应该每5秒钟左右唤醒一次,然后通过networking发送一个快速ping到另一个进程。 这很好地工作,只要其他10个线程什么也不做,但是当其他10个线程运行一个“繁重”的工作时,它永远不会(或很less)运行并发送它的ping。 如果这个“繁重”的工作是CPU密集型的,我可以理解这一点。 但在这样一个“繁重”的工作顶部说50-100%IO等待,但约1%的CPU使用率。 分析表明,在一些NIO调用中,大部分时间花费在10个线程中(等待着我猜)。 这一切都加起来,并且有点期待,因为有关工作的沉重感是从磁盘读取文件。 我不明白的是,在这样一个“沉重”的工作中,做ping的1个线程不能运行。 当顶部显示1%的CPU使用率时,怎么能解释这个问题?看起来10个线程花费了大部分时间来等待IO。 当其他线程正在等待IO时,1个ping线程是否应该获得执行时间? Java线程优先级在所有11个线程上是相等的。 在这10个线程中传播几个yield,似乎可以解决(或降低)这个问题,但我不明白为什么ping线程不能在没有收益的情况下运行,而其他线程没有太多的工作,为IO。 其他信息05.03.2014 我已经在一个更简单的设置中重现了这个问题 – 尽pipe不是很简单(但是您将不得不找出如何安装Apache Zookeeper服务器,但是相当简单 – 稍后我可以提供信息) 在这里findEclipse Kepler项目(maven – 由“mvn package”构build): https : //dl.dropboxusercontent.com/u/25718039/io-test.zip 在这里find二进制文件: https : //dl.dropboxusercontent.com/u/25718039/io-test-1.0-SNAPSHOT-jar-with-dependencies.jar 在机器上启动Apache ZooKeeper 3.4.5(端口2181)服务器。 在另一台单独的机器上(这是我上面所述的Ubuntu 12.04 LTS等)运行二进制文件如下(首先创build一个文件夹io-test-files – 需要50GB的空间) nohup java […]
下面的简单代码例证了一个问题,我正在唤醒一个阻塞在驱动程序调用的线程。 我没有驱动程序的源代码,但是如果驱动程序阻塞的物理设备发生电源中断,则需要唤醒线程才能closures进程。 示例(请参阅下面的代码): main()为SIGINT设置一个信号处理程序,启动一个子线程,然后进入一个无限循环,当它醒来时,它会重复地hibernate,醒来并打印出来。 子线程执行相同的操作,但每次唤醒时都会向进程发送SIGINT 。 sleep()被用作一个简单的阻塞调用。 运行代码显示以下行为: 每次子线程唤醒时,它都会打印出'When'消息(当它醒来的时候)。 然后信号处理程序报告它收到了SIGINT 。 每次“主”唤醒时,都会打印出“何时”消息。 如下: main: 0.127 Child: 0.127 SignalHandler: signum = 2 Child: 5.127 SignalHandler: signum = 2 main: 7.127 Child: 10.127 SignalHandler: signum = 2 main: 14.127 Child: 15.128 SignalHandler: signum = 2 Child: 20.128 SignalHandler: signum = 2 main: 21.127 . . . 我期望,由于进程收到SIGINT的结果, […]
我正试图在两个进程(Process1和Process2)之间使用共享内存来实现IPC , 而不用浪费CPU等待轮到它。 它基本上是在多个过程场景中使用条件variables 。 虽然我可以在亲子场景中做到这一点,但却无法做到两个单独的过程(process1&process2)场景。 这是我在亲子场景中所做的。 ****使用PTHREAD_PROCESS_SHARED标志创buildmptr(共享互斥)和cvptr(条件variables),**** pthread_cond_t *cvptr; //Condition Variable Pointer pthread_condattr_t cattr; //Condition Variable Attribute pthread_mutex_t *mptr; //Mutex Pointer pthread_mutexattr_t matr; //Mutex Attribute int shared_mem_id; //shared memory Id int *mp_shared_mem_ptr; //shared memory ptr — pointing to mutex int *cv_shared_mem_ptr; //shared memory ptr — pointing to condition variable // Setup Mutex rtn = […]