仅当存在多个线程时,Ruby多线程ping才会丢失数据包

时间:2014-06-02 07:05:08

标签: ruby linux multithreading ping

我写了一个ruby脚本来并行ping多个主机并打印[host:result]对。这是我到目前为止制作的剧本:

require 'thread'

    out = ""
    queue = Queue.new
    hosts = ["www.google.com", "www.onet.pl", "www.lego.com", "www.example.com"]

    hosts.each do |x|
      queue << x;
    end

    hash = Hash.new "NO REPLY"
    threads = []
    NO_OF_THREADS = 4;

    for i in 1..NO_OF_THREADS
      threads << Thread.new do

        until queue.empty? do
          host = queue.pop(true) rescue nil

          if host
            out = `ping #{host} -c 10 | grep 'packet loss'`
            hash[host] = out
          end

        end # until
      end # thread
    end # for

    threads.each do |t|
        t.join
    end

    puts hash

当我将线程数设置为1时,我得到0% packets lost个响应,但是当我尝试一次执行多个线程时,我收到了大量丢失的数据包。我用一长串主机执行这个脚本来检查和许多线程;结果是我列表中的大多数主机都丢失了100%的数据包。

我尝试与Mutex同步,而不是使用Queue并在帖子中添加sleep,但我没有帮助。此时我不确定我的代码是否存在问题,或者我误解了ping应该如何工作。为什么我丢失了很多数据包?有办法解决吗?

1 个答案:

答案 0 :(得分:0)

首先想到的是,并非所有这些主机都必须允许ICMP PING消息。

但是,我运行您的代码,并在主机上获得0%的数据包丢失:

www.google.com10 packets transmitted, 10 packets received, 0.0% packet loss
www.lego.com10 packets transmitted, 10 packets received, 0.0% packet loss
www.onet.pl10 packets transmitted, 10 packets received, 0.0% packet loss
www.example.com10 packets transmitted, 10 packets received, 0.0% packet loss

您在运行代码的是什么?一台虚拟机?可能存在一些潜在的操作系统问题,表现为丢失数据包。