Open-MPI 1.3.3 kullanan bir kümede CentOS 5.4 x86_64 ve Boost 1.42.0 kullanıyorum. Kullanılacak birden çok işlem için büyük miktarda veri depolamak için paylaşılan belleği kullanan bir paylaşılan kitap yazıyorum. Ayrıca, dosyalardaki verileri okuyacak ve paylaşılan belleğe yükleyecek bir yükleyici uygulaması da vardır.Yükseltme :: Interprocess Paylaşılan Bellek Veriyolu Hatası
Yükleyici uygulamasını çalıştırdığımda, verileri tam olarak saklamak için gereken bellek miktarını belirler, ardından ek yük için% 25 ekler. Hemen hemen her dosya için 2'den fazla veri değeri olacak. Boost'un Interprocess kitaplığını kullanarak bellek isteğini yaptığımda, istenen bellek miktarını başarılı bir şekilde rezerve ettiğini söylüyor. Ama kullanmaya başladığımda, "Bus hatası" alıyorum. Anlayabildiğim kadarıyla, veriyolu hatası, bellek segmenti için kullanılabilen menzil dışındaki belleğe erişimin bir sonucudur.
Bu nedenle, paylaşılan belleğin Linux'ta nasıl olduğunu ve sistemimin büyük miktarda paylaşılan belleğe izin verecek biçimde doğru şekilde yapılandırıldığından emin olmak için nelerin denetleneceğini inceledim. 4294967296 (4 Gb)
shmmax
- - 68719476736 (68 Gb)shmmni
- 4096shmall
:- Ben
/proc/sys/kernel/shm*
de "dosyaları" baktı ipcs -lm
komutunu aradım: Söyleyebileceğim kadarıyla
, bu ayarlar benim amaçlar için yeterli paylaşılan bellek ayrılamadı gerekir göstermektedir. çizgi ile Derleyen
#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; }
: Yani paylaşılan hafızada büyük miktarda veri yarattı tam olmayan bir program oluşturdu
g++ ShmTest.cpp -lboost_system -lrt
Daha sonra aşağıdaki çıkışı ile koştum (küçültmek için düzenlenmiş):
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
Eğer bir parametre (herhangi bir sadece
argc
artırmak gerekir çalışır) ile program çalıştırırsanız, o vektör preallocate ama hala bir bu da neden olacaktır aynı dizi dizinindeki hata.total 2.0G 0 . 0 .. 2.0G ShmTest
Ve sadece benim özgün uygulama ile gibi ayrılan paylaşılan bellek boyutu 2 konser kapaklanmış olup:
Benls -ash /dev/shm
komutunu kullanarak/dev/shm
kısmındaki "dosyalarının" boyutunu kontrol etti. "Başarılı bir şekilde" 2352000000 bayt bellek ayırdığı göz önüne alındığında, gigabaytlarda (1024 * 1024 * 1024 kullanılarak) 2.19 Gb olmalıdır.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). --------------------------------------------------------------------------
Gerçekten bu ile nereye emin değilim:
Ben MPI kullanarak veri yüklemek için benim asıl programı çalıştırmak
, bu hata çıktı alabilirsiniz. Kimin denemek istediğine dair bir önerisi var mı?Yeterince uzun cevap aramaya devam eğer Linux'ta ... https://svn.boost.org/trac/boost/ticket/4374- Ben
alınan/ortaya çıkarılmıştır. Destek dev listesine bir şey göndermelisiniz. Bu arada, kendi cevabınızı kabul edebileceğinizi düşünüyorum :) Cevabınız için teşekkürler. – neuro
Evet, biraz da sinir bozucu. :) Bunu https://svn.boost.org/trac/boost/ticket/4374 adresindeki Boost hata takibine gönderdim. – CuppM