2012-01-14 13 views
8

मैं वर्तमान में कुछ व्यक्तिगत परीक्षणों और बेंचमार्क पर काम कर रहा हूं ताकि वास्तविक दुनिया उदाहरण डेटा के साथ मोंगोडीबी और माईएसक्यूएल का उपयोग करने के बीच वर्कफ़्लो और दक्षता की तुलना की जा सके।PHP में 12000 मोंगो डीबी उदाहरण खोलना और बंद करना

प्रत्येक डेटाबेस में अपना डेटा सेट करने के लिए मैं कई हज़ार लूप कर रहा हूं और डेटाबेस में डालने के लिए यादृच्छिक रूप से डेटा ऑब्जेक्ट्स बना रहा हूं।

हालांकि मुझे PHP में मोंगो क्लास का उपयोग करने में कुछ समस्याएं हैं जिन्हें मैं हल नहीं कर सकता। समस्या इस प्रकार है:

मेरे पास एक लूप है जो एक नया मोंगो इंस्टेंस और कनेक्शन बनाता है, संग्रह में एक छोटी सरणी डालता है और फिर कनेक्शन बंद कर देता है। यह पाश 20000 बार चलाना चाहिए। हालांकि यह 16300 वें लूप के आसपास हमेशा विफल रहता है (16200 के मिनट के साथ और अधिकतम 16350 मैं कुछ रनों के बाद कहूंगा) जब यह उदाहरण बनाने/कनेक्शन बनाने का प्रयास करता है।

पाश में कोड के नीचे है:

$data = get_random_user_data(); 

$mongo = new Mongo('mongodb://admin:[email protected]:27017/test'); 

    if ($mongo->test->users->insert($data)) { 
     $users[] = array('id' => $data['_id'], 'name' => $data['username']); 
    echo $i." - Added user: ".$data['username'].'<br/>'; 
    } 

$mongo->close(); 

get_random_user_data() सिर्फ एक सरल साहचर्य सरणी देता है।

त्रुटि मैं मिलता है:

Fatal error: Uncaught exception 'MongoConnectionException' with message 'Unknown error' 

लाइन पर:

$mongo = new Mongo('mongodb://admin:[email protected]:27017/test'); 

कोई भी विचार? क्या कुछ मौलिक है जो मुझे कुछ सुरक्षा या स्पैम-रोकथाम की तरह याद आ रही है?

अग्रिम धन्यवाद।

अतिरिक्त जानकारी:

स्क्रिप्ट 114.9797 के बारे में सेकंड में मर जाता है। यह एक PHP मेमोरी या समय आधारित मुद्दा नहीं है क्योंकि सभी सीमाएं उठाई गई हैं और मैंने कल बिना किसी समस्या के लगभग 120000 पंक्तियां (खुले कनेक्शन, डालने, बंद कनेक्शन को लूप करने की एक ही विधि के साथ) में अपना MySQL बेंचमार्क चलाया।

पीएचपी संस्करण चला 5.3.5

phpinfo मोंगो जानकारी:

MongoDB Support enabled 
Version 1.2.0- 
Directive Local Value Master Value 
mongo.allow_empty_keys 0 0 
mongo.allow_persistent 1 1 
mongo.auto_reconnect 1 1 
mongo.chunk_size 262144 262144 
mongo.cmd $ $ 
mongo.default_host localhost localhost 
mongo.default_port 27017 27017 
mongo.long_as_object 0 0 
mongo.native_long 0 0 
mongo.no_id 0 0 
mongo.utf8 1 1 
+1

हम्म, दिलचस्प। क्या आप कनेक्शन का पुनः उपयोग कर सकते हैं? शायद यह प्रति प्रक्रिया की बात है? क्या होता है यदि आप एक ही चीज़ को कोशिश करते हैं, तो पाइथन कहें? क्या आपने 'अज्ञात त्रुटि' के लिए MongoDB स्रोत (और/या PHP ड्राइवर) को grepped किया है? यदि आप कनेक्शन के बीच थोड़ा सोते हैं तो क्या होगा? – Cameron

+0

वास्तव में कनेक्शन का पुन: उपयोग नहीं कर सकता क्योंकि यह एक बात है जिसे मैं बेंचमार्क में शामिल करना चाहता हूं। इस टिप्पणी के समय किसी ने कहा है कि उन्हें अपने रूबी ड्राइवर के साथ एक ही समस्या मिलती है। स्रोत में बिल्कुल नहीं देखा लेकिन जब मुझे मौका मिलेगा तो मैं करूंगा। उत्तर के लिए धन्यवाद। :) – Chrisui

+0

हां, मैं बेंचमार्क के बारे में समझता हूं, मैं बस सोच रहा था कि क्या यह समस्याएं पैदा कर रहे हैं जो कई कनेक्शन हैं (जो संभवतः रमेश के जवाब दिए गए हैं) – Cameron

उत्तर

6

का उपयोग कर रहे हैं आपके ऑपरेटिंग सिस्टम में सीमित संख्या में सॉकेट खोलने के इच्छुक हैं। जब आप सॉकेट खोलते हैं और फिर इसे बंद करते हैं, तो ओएस तुरंत इसे "उपलब्ध" पूल में नहीं डालता है, यह "टाइम प्रतीक्षा" स्थिति में थोड़ी देर के लिए बाहर निकलता है, जिसमें नेट in his answer का उल्लेख करता है।

आप अपने ओएस खोलने वाले सॉकेट की संख्या बढ़ा सकते हैं, http://www.mongodb.org/display/DOCS/Too+Many+Open+Files देखें (प्रत्येक सॉकेट एक खुली "फ़ाइल" है)।

इसके अलावा, आप ड्राइवर के एक पुराने पुराने संस्करण का उपयोग कर रहे हैं, तो आप उन्नयन पर विचार करना चाहेंगे।

+0

सहायता के लिए धन्यवाद! – Chrisui

3

मैं पुष्टि करें कि यह गहरे लाल रंग का चालक भी से एक ही व्यवहार है। मैंने रूबी मोंगो के साथ इसी तरह के मामले को दोहराया, जो प्रत्येक बार मोंगो इंस्टेंस खोलने/बंद करके 20000 रिकॉर्ड दर्ज करता है। और यह 14200.

यह करने के लिए 14110 के बीच में नाकाम रहने पर रखने यह पूरा स्टैक ट्रेस

Failed to connect to host localhost and port 27017: Cannot assign requested address - connect(2) 
["/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/pool.rb:171:in `rescue in checkout_new_socket'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/pool.rb:166:in `checkout_new_socket'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/pool.rb:267:in `block (2 levels) in checkout'", "<internal:prelude>:10:in `synchronize'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/pool.rb:259:in `block in checkout'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/pool.rb:252:in `loop'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/pool.rb:252:in `checkout'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/connection.rb:496:in `checkout_writer'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/networking.rb:34:in `send_message'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/collection.rb:948:in `block in insert_documents'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/util/logging.rb:28:in `instrument'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/collection.rb:944:in `insert_documents'", "/home/ramesh/.rvm/gems/ruby-1.9.2-p290/gems/mongo-1.5.2/lib/mongo/collection.rb:343:in `insert'", "/home/ramesh/Desktop/load_test.rb:15:in `block in load_test'", "/home/ramesh/Desktop/load_test.rb:6:in `times'", "/home/ramesh/Desktop/load_test.rb:6:in `load_test'", "(irb):2:in `irb_binding'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/workspace.rb:80:in `eval'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/workspace.rb:80:in `evaluate'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/context.rb:254:in `evaluate'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:159:in `block (2 levels) in eval_input'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:273:in `signal_status'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:155:in `eval_input'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:70:in `block in start'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:69:in `catch'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/irb.rb:69:in `start'", "/home/ramesh/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'"] 
ArgumentError: uncaught throw #<Mongo::ConnectionFailure: Failed to connect to host localhost and port 27017: Cannot assign requested address - connect(2)> 
    from /home/ramesh/Desktop/load_test.rb:21:in `throw' 
    from /home/ramesh/Desktop/load_test.rb:21:in `rescue in block in load_test' 
    from /home/ramesh/Desktop/load_test.rb:7:in `block in load_test' 
    from /home/ramesh/Desktop/load_test.rb:6:in `times' 
    from /home/ramesh/Desktop/load_test.rb:6:in `load_test' 

के रूप में भी @Chrisui ने कहा, मैं भी अनुभव नहीं कर रहा हूँ त्रुटि संदेश

uncaught throw #<Mongo::ConnectionFailure: Failed to connect to host localhost and port 27017: Cannot assign requested address - connect(2)> 

है कोई स्मृति बूंदें।

यह स्क्रिप्ट मैं

require 'mongo' 

def load_test 
    start = Time.now 
    puts 'starting at :' + start.to_s 
    20000.times do |i|  
      begin 
       puts i  
      doc = {"name" => "MongoDB", "type" => "database", "count" => 1,"info" => {"x" => 203, "y" => '102'}} 
      con = Mongo::Connection.new("localhost") 
      db = con['bulktest'] 
      coll = db['test'] 
      coll.insert(doc) 
      con.close 
       con,db,coll=nil,nil,nil 
     rescue Exception => e 
      puts e.message 
      puts e.backtrace.inspect 
      throw e 
     end 

    end 
    stop = Time.now 
    puts 'stoping at :' + stop.to_s 
    puts 'elapsed time is ' + (stop-start).to_s + ' seconds' 
end 
1

आपका बेंचमार्क मतलब नहीं है की कोशिश की है है।खुला/बंद कनेक्शन न रखें। आपको हर बार खोलने/बंद करने के बजाय लगातार कनेक्शन का पुन: उपयोग करना चाहिए। यदि आप सॉकेट को जल्दी से खोलते और बंद करते हैं, तो आपके पास टाइम-वेट स्टेटस में बहुत से सॉकेट होंगे जो अभी भी फ़ाइल डिस्क्रिप्टर

+0

यह समझ में आता है। पूरा विचार कनेक्शन खोलने के लिए लगने वाले समय को बेंचमार्क करना है, कुछ और बंद करें। अर्थात। हजारों बार एक त्वरित अनुरोध की प्रतिलिपि बनाना। क्या आप इस "समय-प्रतीक्षा राज्य" को और अधिक समझा सकते हैं? – Chrisui

+0

देखें http://stackoverflow.com/questions/1803566/what-is-the-cost-of-many-time-wait-on-the-server-side – Nat

संबंधित मुद्दे