检测IDLE处理器的ruby数量

我在4到24个核心的共享Linux机器上工作。 为了充分利用它们,我使用下面的代码来检测ruby脚本中处理器的数量:

return `cat /proc/cpuinfo | grep processor | wc -l`.to_i 

(也许有一种纯粹的ruby方式呢?)

但有时一个同事正在使用24个内核中的6个或8个。 (如通过顶部看到的)。 我怎样才能估计当前未使用的处理器的数量,而不会让任何人感到不安?

谢谢!

您可以使用/proc文件系统中的数据来获取正在运行的进程的CPU关联信息。 以下应该给你当前正在使用的CPU数量(注意:我没有一个方便的Linux或Ruby框,所以这个代码没有经过测试,但你可以得到这个想法):

 def processors_in_use procs=[] Dir.glob("/proc/*/stat") {|filename| next if File.directory?(filename) this_proc=[] File.open(filename) {|file| this_proc = file.gets.split.values_at(2,38)} procs << this_proc[1].to_i if this_proc[0]=="R" } procs.uniq.length end def num_processors IO.readlines("/proc/cpuinfo").delete_if{|x| x.index("processor")==nil}.length end def num_free_processors num_processors - processors_in_use end def estimate_free_cpus(count, waittime) results=[] count.times { results << num_free_processors sleep(waittime) } sum=0 results.each {|x| sum += x} (sum.to_f / results.length).round end 

编辑:我证实了上述代码的作品(我使用Ruby 1.9)

受bta的回复启发,这就是我正在使用的:

 private def YWSystemTools.numberOfActiveProcessors # internal processorForProcs = [] processFiles = Dir.glob("/proc/*/stat") raise IOError, 'Cannot find /proc/*/stat files. Are you sure this is a linux machine?' if processFiles.empty? processFiles.each do |filename| next if File.directory?(filename) # because /proc/net/stat is a directory next if !File.exists?(filename) # may have disappeared in the meantime this_proc = [] File.open(filename) { |file| this_proc = file.gets.split.values_at(2,38) } processorForProcs << this_proc[1].to_i if this_proc[0]=="R" end processorsInUse = processorForProcs.uniq return(processorsInUse.length) end public def YWSystemTools.numberOfAvailableProcessors numberOfAttempts = 5 $log.info("Will determine number of available processors. Wait #{numberOfAttempts.to_s} seconds.") #we estimate 5 times because of local fluctuations in procesor use. Keep minimum. estimationsOfNumberOfActiveProcessors = [] numberOfAttempts.times do estimationsOfNumberOfActiveProcessors << YWSystemTools.numberOfActiveProcessors sleep(1) end numberOfActiveProcessors = estimationsOfNumberOfActiveProcessors.min numberOfTotalProcessors = number_of_processors() raise IOError, '!! # active Processors > # processors' if numberOfActiveProcessors > numberOfTotalProcessors numberOfAvailableProcessors = numberOfTotalProcessors - numberOfActiveProcessors $log.info("#{numberOfAvailableProcessors} out of #{numberOfTotalProcessors} are available!") return(numberOfAvailableProcessors) end