Определить количество процессоров IDLE ruby - PullRequest
3 голосов
/ 12 апреля 2010

Я работаю на общих Linux-машинах с 4 - 24 ядрами. Чтобы наилучшим образом использовать их, я использую следующий код для определения количества процессоров в моих скриптах ruby:

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

(может быть, есть чисто рубиновый способ сделать это?)

Но иногда коллега использует шесть или восемь из 24 ядер. (как видно через верх). Как получить оценку количества неиспользуемых в настоящее время процессоров, которые я могу использовать, не расстраивая никого?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 апреля 2010

Вы можете использовать данные в файловой системе /proc, чтобы получить информацию о соответствии ЦП для запущенных процессов. Следующее должно дать вам количество процессоров, используемых в настоящее время (Примечание: у меня нет удобной коробки 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)

2 голосов
/ 29 апреля 2010

вдохновленный ответом 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...