2010-06-23 19 views
9

मैं CentOS 5.4 x86_64 उपयोग कर रहा हूँ और एक क्लस्टर खुली एमपीआई 1.3.3 का उपयोग करता है पर 1.42.0 बढ़ावा। मैं एक साझा लाइब्रेरी लिख रहा हूं जो एकाधिक प्रक्रियाओं के उपयोग के लिए बड़ी मात्रा में डेटा स्टोर करने के लिए साझा मेमोरी का उपयोग करता है। एक लोडर एप्लिकेशन भी है जो फ़ाइलों से डेटा में पढ़ेगा और उन्हें साझा मेमोरी में लोड करेगा।बूस्ट :: Interprocess साझा मेमोरी बस त्रुटि

जब मैं लोडर एप्लिकेशन को चलाने के लिए, यह स्मृति की मात्रा है कि यह डाटा स्टोर करने की जरूरत है वास्तव में तो भूमि के ऊपर के लिए 25% कहते हैं निर्धारित करता है। लगभग हर फाइल के लिए, यह 2 गीगा के बराबर डेटा होगा। जब मैं बूस्ट के Interprocess लाइब्रेरी का उपयोग कर स्मृति अनुरोध करते हैं, यह कहना है कि वह सफलतापूर्वक स्मृति के अनुरोध राशि आरक्षित किया गया है। लेकिन जब मैं इसका उपयोग शुरू करने के लिए उपयोग करता हूं, तो मुझे "बस त्रुटि" मिलती है। मैं क्या बता सकते हैं, बस त्रुटि रेंज है कि स्मृति खंड के लिए उपलब्ध है बाहर स्मृति तक पहुँचने का एक परिणाम है।

तो मैं कैसे साझा स्मृति लिनक्स पर है की जांच कर रहे हैं और क्या यकीन है कि मेरे प्रणाली सही ढंग से साझा स्मृति की है कि बड़ी मात्रा में अनुमति देने के लिए कॉन्फ़िगर किया गया है करने के लिए जाँच करने के लिए शुरू कर दिया। 4294967296 (4 जीबी)

  • shmmax - - +६८७१९४७६७३६ (68 जीबी)
  • shmmni - 4096

    • shmall:

      1. मैं /proc/sys/kernel/shm* पर "फ़ाइलें" को देखा ipcs -lm आदेश
      2. मैं कहा जाता है:
        ------ Shared Memory Limits -------- 
        max number of segments = 4096 
        max seg size (kbytes) = 67108864 
        max total shared memory (kbytes) = 17179869184 
        min seg size (bytes) = 1

      मैं क्या बता सकते हैं, उन सेटिंग्स से संकेत मिलता है कि मैं अपने उद्देश्यों के लिए पर्याप्त साझा स्मृति आवंटित करने के लिए सक्षम होना चाहिए। (यह छोटा करने के लिए संपादित

      g++ ShmTest.cpp -lboost_system -lrt

      तो निम्न उत्पादन के साथ यह भाग गया:

      
      #include <iostream> 
      
      #include <boost/interprocess/managed_shared_memory.hpp> 
      #include <boost/interprocess/allocators/allocator.hpp> 
      #include <boost/interprocess/containers/vector.hpp> 
      
      namespace bip = boost::interprocess; 
      
      typedef bip::managed_shared_memory::segment_manager segment_manager_t; 
      typedef bip::allocator<long, segment_manager_t> long_allocator; 
      typedef bip::vector<long, long_allocator> long_vector; 
      
      int main(int argc, char ** argv) { 
          struct shm_remove { 
           shm_remove() { bip::shared_memory_object::remove("ShmTest"); } 
           ~shm_remove() { bip::shared_memory_object::remove("ShmTest"); } 
          } remover; 
      
          size_t szLength = 280000000; 
          size_t szRequired = szLength * sizeof(long); 
          size_t szRequested = (size_t) (szRequired * 1.05); 
          bip::managed_shared_memory segment(bip::create_only, "ShmTest", szRequested); 
      
          std::cout << 
           "Length:  " << szLength << "\n" << 
           "sizeof(long): " << sizeof(long) << "\n" << 
           "Required:  " << szRequired << "\n" << 
           "Requested: " << szRequested << "\n" << 
           "Allocated: " << segment.get_size() << "\n" << 
           "Overhead:  " << segment.get_size() - segment.get_free_memory() << "\n" << 
           "Free:   " << segment.get_free_memory() << "\n\n"; 
      
          long_allocator alloc(segment.get_segment_manager()); 
          long_vector vector(alloc); 
      
          if (argc > 1) { 
           std::cout << "Reserving Length of " << szLength << "\n"; 
           vector.reserve(szLength); 
           std::cout << "Vector Capacity: " << vector.capacity() << "\tFree: " << segment.get_free_memory() << "\n\n"; 
          } 
      
          for (size_t i = 0; i < szLength; i++) { 
           if ((i % (szLength/100)) == 0) { 
            std::cout << i << ": " << "\tVector Capacity: " << vector.capacity() << "\tFree: " << segment.get_free_memory() << "\n"; 
           } 
           vector.push_back(i);  
          } 
          std::cout << "end: " << "\tVector Capacity: " << vector.capacity() << "\tFree: " << segment.get_free_memory() << "\n"; 
      
          return 0; 
      } 
      

      लाइन के साथ यह संकलित: तो मैं एक नीचे छीन प्रोग्राम है जो साझा स्मृति में डेटा की बड़ी मात्रा बनाया बनाया):

       
      Length:  280000000 
      sizeof(long): 8 
      Required:  2240000000 
      Requested: 2352000000 
      Allocated: 2352000000 
      Overhead:  224 
      Free:   2351999776 
      
      0:  Vector Capacity: 0  Free: 2351999776 
      2800000:  Vector Capacity: 3343205  Free: 2325254128 
      5600000:  Vector Capacity: 8558607  Free: 2283530912 
      8400000:  Vector Capacity: 8558607  Free: 2283530912 
      11200000:  Vector Capacity: 13693771  Free: 2242449600 
      14000000:  Vector Capacity: 21910035  Free: 2176719488 
      ... 
      19600000:  Vector Capacity: 21910035  Free: 2176719488 
      22400000:  Vector Capacity: 35056057  Free: 2071551312 
      ... 
      33600000:  Vector Capacity: 35056057  Free: 2071551312 
      36400000:  Vector Capacity: 56089691  Free: 1903282240 
      ... 
      56000000:  Vector Capacity: 56089691  Free: 1903282240 
      58800000:  Vector Capacity: 89743507  Free: 1634051712 
      ... 
      89600000:  Vector Capacity: 89743507  Free: 1634051712 
      92400000:  Vector Capacity: 143589611  Free: 1203282880 
      ... 
      142800000:  Vector Capacity: 143589611  Free: 1203282880 
      145600000:  Vector Capacity: 215384417  Free: 628924432 
      ... 
      212800000:  Vector Capacity: 215384417  Free: 628924432 
      215600000:  Vector Capacity: 293999969  Free: 16 
      ... 
      260400000:  Vector Capacity: 293999969  Free: 16 
      Bus error 
      

      आप एक पैरामीटर (किसी भी काम करेंगे, बस argc बढ़ाने की आवश्यकता) के साथ कार्यक्रम चलाते हैं, तो यह वेक्टर preallocate लेकिन अभी भी एक बू में परिणाम होगा एक ही सरणी सूचकांक में त्रुटि।

      मैं /dev/shm पर "फ़ाइलें" के आकार की जाँच की ls -ash /dev/shm आदेश का उपयोग:

       
      total 2.0G 
          0 .  0 .. 2.0G ShmTest 
      

      और बस अपने मूल आवेदन के साथ जैसे कि यह आवंटित साझा स्मृति का आकार 2 gigs पर सीमित कर दिया गया है। यह देखते हुए कि गीगाबाइट्स में 102452000000 बाइट्स मेमोरी को "सफलतापूर्वक" आवंटित किया गया है (1024 * 1024 * 1024 का उपयोग करके) यह 2.1 9 जीबी होना चाहिए।

       
      Requested: 2808771120 
      Recieved: 2808771120 
      
      [c1-master:13894] *** Process received signal *** 
      [c1-master:13894] Signal: Bus error (7) 
      [c1-master:13894] Signal code: (2) 
      [c1-master:13894] Failing at address: 0x2b3190157000 
      [c1-master:13894] [ 0] /lib64/libpthread.so.0 [0x3a64e0e7c0] 
      [c1-master:13894] [ 1] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost12interprocess26uninitialized_copy_or_moveINS0_10offset_ptrIlEEPlEET0_T_S6_S5_PNS_10disable_ifINS0_11move_detail16is_move_iteratorIS6_EEvE4typeE+0x218) [0x2b310dcf3fb8] 
      [c1-master:13894] [ 2] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost9container6vectorIlNS_12interprocess9allocatorIlNS2_15segment_managerIcNS2_15rbtree_best_fitINS2_12mutex_familyENS2_10offset_ptrIvEELm0EEENS2_10iset_indexEEEEEE15priv_assign_auxINS7_IlEEEEvT_SG_St20forward_iterator_tag+0xa75) [0x2b310dd0a335] 
      [c1-master:13894] [ 3] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost9container17containers_detail25advanced_insert_aux_proxyINS0_6vectorIlNS_12interprocess9allocatorIlNS4_15segment_managerIcNS4_15rbtree_best_fitINS4_12mutex_familyENS4_10offset_ptrIvEELm0EEENS4_10iset_indexEEEEEEENS0_17constant_iteratorISF_lEEPSF_E25uninitialized_copy_all_toESI_+0x1d7) [0x2b310dd0b817] 
      [c1-master:13894] [ 4] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost9container6vectorINS1_IlNS_12interprocess9allocatorIlNS2_15segment_managerIcNS2_15rbtree_best_fitINS2_12mutex_familyENS2_10offset_ptrIvEELm0EEENS2_10iset_indexEEEEEEENS3_ISD_SB_EEE17priv_range_insertENS7_ISD_EEmRNS0_17containers_detail23advanced_insert_aux_intISD_PSD_EE+0x771) [0x2b310dd0d521] 
      [c1-master:13894] [ 5] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost12interprocess6detail8Ctor3ArgINS_9container6vectorINS4_IlNS0_9allocatorIlNS0_15segment_managerIcNS0_15rbtree_best_fitINS0_12mutex_familyENS0_10offset_ptrIvEELm0EEENS0_10iset_indexEEEEEEENS5_ISF_SD_EEEELb0EiSF_NS5_IvSD_EEE11construct_nEPvmRm+0x157) [0x2b310dd0d9a7] 
      [c1-master:13894] [ 6] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost12interprocess15segment_managerIcNS0_15rbtree_best_fitINS0_12mutex_familyENS0_10offset_ptrIvEELm0EEENS0_10iset_indexEE28priv_generic_named_constructIcEEPvmPKT_mbbRNS0_6detail18in_place_interfaceERNS7_INSE_12index_configISB_S6_EEEENSE_5bool_ILb1EEE+0x6fd) [0x2b310dd0c85d] 
      [c1-master:13894] [ 7] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN5boost12interprocess15segment_managerIcNS0_15rbtree_best_fitINS0_12mutex_familyENS0_10offset_ptrIvEELm0EEENS0_10iset_indexEE22priv_generic_constructEPKcmbbRNS0_6detail18in_place_interfaceE+0xf8) [0x2b310dd0dd58] 
      [c1-master:13894] [ 8] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN7POP_LTL16ExportPopulation22InitializeSharedMemoryEPKc+0x1609) [0x2b310dceea99] 
      [c1-master:13894] [ 9] ../LookupPopulationLib/Release/libLookupPopulation.so(_ZN7POP_LTL10InitializeEPKc+0x349) [0x2b310dd0ebb9] 
      [c1-master:13894] [10] MPI_Release/LookupPopulation.MpiLoader(main+0x372) [0x4205d2] 
      [c1-master:13894] [11] /lib64/libc.so.6(__libc_start_main+0xf4) [0x3a6461d994] 
      [c1-master:13894] [12] MPI_Release/LookupPopulation.MpiLoader(__gxx_personality_v0+0x239) [0x420009] 
      [c1-master:13894] *** End of error message *** 
      -------------------------------------------------------------------------- 
      mpirun noticed that process rank 0 with PID 13894 on node c1-master exited on signal 7 (Bus error). 
      -------------------------------------------------------------------------- 
      

      मैं सच में यकीन है कि जहां इस के साथ जाने के लिए नहीं कर रहा हूँ:

      जब मैं एमपीआई का उपयोग कर डेटा लोड करने के लिए अपने वास्तविक कार्यक्रम चलाने के लिए, मैं इस त्रुटि उत्पादन मिलता है। क्या किसी के पास कोई सुझाव है कि क्या प्रयास करना है?साझा स्मृति तंत्र का उपयोग करता है (tmpfs) द्वारा https://svn.boost.org/trac/boost/ticket/4374

    उत्तर

    8

    ठीक है, अगर आप इस सवाल का जवाब काफी लंबे समय के लिए देखते रहो ...

    लिनक्स पर:


    पर बूस्ट बग Trac को प्रकाशित किया गया था डिफ़ॉल्ट रूप से इसे सिस्टम रैम के आधे तक सीमित करता है। तो मेरे क्लस्टर पर यह 2 जीबी है क्योंकि हमारे पास 4 जीबी सिस्टम रैम है। इसलिए जब उसने साझा मेमोरी सेगमेंट आवंटित करने का प्रयास किया, तो यह /dev/shm पर अधिकतम आकार तक आवंटित किया गया।

    लेकिन मुद्दा तब आया जब बूस्ट लाइब्रेरी ने त्रुटि का संकेत नहीं दिया था या यहां तक ​​कि रिपोर्ट की याद की गई राशि की आवृत्ति राशि को आवंटित नहीं किया गया था। यह तब तक खुश था जब तक यह सेगमेंट के अंत तक नहीं पहुंच गया और फिर गलती हुई।

    दीर्घकालिक समाधान /etc/fstab फ़ाइल को स्थायी रूप से बदलने के लिए अद्यतन करना है, लेकिन प्रत्येक नोड पर उपलब्ध साझा स्मृति के आकार को रीबूट तक बढ़ाने के लिए कमांड लाइन कॉल चलाया जा सकता है।

    mount -o remount,size=XXX /dev/shm

    कहाँ XXX स्मृति की मात्रा उपलब्ध बनाने के लिए (उदाहरण के size=4G के लिए) है।

    यह http://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html

    +1

    दिलचस्प से निकाला गया/लिया गया था। आपको बूस्ट देव सूची पर कुछ पोस्ट करना चाहिए। वैसे, मुझे लगता है कि आप अपना जवाब स्वीकार कर सकते हैं :) उत्तर के लिए धन्यवाद। – neuro

    +0

    हाँ, थोड़ा निराशाजनक भी। :) मैंने इसे बूस्ट बग ट्रैकिंग में https://svn.boost.org/trac/boost/ticket/4374 पर पोस्ट किया। – CuppM

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