检测IDLE处理器的数量ruby

时间:2010-04-12 18:29:27

标签: ruby linux unix shell

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

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

(也许有一种纯粹的红宝石方式吗?)

但有时一位同事正在使用24个核心中的六个或八个。 (通过顶部看到)。如何估计当前未使用的处理器数量,而不会让任何人感到不安?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用/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)

答案 1 :(得分:2)

受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