পাইথন সাবপ্রসেস.পোপেন "ওসিরর: [এর্নো 12] মেমরি বরাদ্দ করতে পারে না"


114

দ্রষ্টব্য: এই প্রশ্নটি এখানে প্রাথমিকভাবে জিজ্ঞাসা করা হয়েছিল তবে গ্রহণযোগ্য উত্তরটি আসলে পাওয়া না গেলেও অনুগ্রহের সময়টি শেষ হয়ে গিয়েছিল। মূল প্রশ্নে প্রদত্ত সমস্ত বিবরণ সহ আমি এই প্রশ্নটি পুনরায় জিজ্ঞাসা করছি।

একটি পাইথন স্ক্রিপ্ট শিডিউল মডিউলটি ব্যবহার করে প্রতি 60 সেকেন্ডে শ্রেণি ফাংশনের একটি সেট চালাচ্ছে :

# sc is a sched.scheduler instance
sc.enter(60, 1, self.doChecks, (sc, False))

স্ক্রিপ্টটি এখানে কোড ব্যবহার করে একটি ডিমনাইজড প্রক্রিয়া হিসাবে চলছে ।

DoChecks এর অংশ হিসাবে ডাকা হয় এমন অনেকগুলি শ্রেণীর পদ্ধতি সিস্টেমের পরিসংখ্যান পাওয়ার জন্য সিস্টেম ফাংশনগুলিতে কল করতে সাবপ্রসেস মডিউল ব্যবহার করে :

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]

পুরো স্ক্রিপ্টটি নিম্নলিখিত ত্রুটির সাথে ক্র্যাশ হওয়ার আগে এটি সময়ের জন্য ঠিক হয়ে যায়:

File "/home/admin/sd-agent/checks.py", line 436, in getProcesses
File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
File "/usr/lib/python2.4/subprocess.py", line 835, in _get_handles
OSError: [Errno 12] Cannot allocate memory

একবার স্ক্রিপ্ট ক্র্যাশ হয়ে গেলে সার্ভারে ফ্রি-এম এর আউটপুট হয়:

$ free -m
                  total       used       free     shared     buffers    cached
Mem:                894        345        549          0          0          0
-/+ buffers/cache:  345        549
Swap:                 0          0          0

সার্ভারটি সেন্টস 5.3 চলছে running আমি নিজের সেন্টোস বাক্সে বা অন্য কোনও ব্যবহারকারীকে একই সমস্যার প্রতিবেদন করাতে পুনরুত্পাদন করতে অক্ষম।

মূল প্রশ্নে পরামর্শ হিসাবে আমি এটি ডিবাগ করার জন্য বেশ কয়েকটি বিষয় চেষ্টা করেছি:

  1. পপেন কল করার আগে এবং পরে ফ্রি-এম এর আউটপুট লগইন করা হচ্ছে। মেমরির ব্যবহারের ক্ষেত্রে উল্লেখযোগ্য পরিবর্তন নেই অর্থাৎ স্ক্রিপ্ট চলার সাথে সাথে ধীরে ধীরে স্মৃতি ব্যবহার করা হচ্ছে না।

  2. আমি পপেন কলটিতে ক্লোজ_ফিডস = সত্য সংযুক্ত করেছি তবে এতে কোনও ত্রুটি হয়নি - স্ক্রিপ্টটি এখনও একই ত্রুটির সাথে ক্র্যাশ হয়েছে। এখানে এবং এখানে প্রস্তাবিত ।

  3. এখানে প্রস্তাবিত হিসাবে আমি RLIMIT_DATA এবং RLIMIT_AS উভয়তেই (-1, -1) দেখানো রিলিটগুলি পরীক্ষা করেছিলাম ।

  4. একটি নিবন্ধে প্রস্তাব দেওয়া হয়েছে যে কোনও অদলবদল না থাকার কারণ হতে পারে তবে অদলবদুই আসলে চাহিদা অনুযায়ী পাওয়া যায় (ওয়েব হোস্টের মতে) এবং এটি এখানে একটি বোগাস কারণ হিসাবেও প্রস্তাবিত হয়েছিল ।

  5. প্রসেস বন্ধ হয়ে যাচ্ছে কারণ যে .communicate () যেমন পাইথন সোর্স কোড এবং মন্তব্য দ্বারা ব্যাক আপ ব্যবহারের আচরণ এখানে

442 লাইন থেকে সংজ্ঞায়িত getProcesses ফাংশনটির সাথে পুরো চেকগুলি এখানে গিটহাবে পাওয়া যাবে This লাইন 520 থেকে শুরু করে এটি ডোচেকস () দ্বারা ডাকা হয়।

স্ক্রিপ্টটি ক্র্যাশের আগে নিম্নলিখিত আউটপুট সহ স্ট্রেসের সাথে চালানো হয়েছিল:

recv(4, "Total Accesses: 516662\nTotal kBy"..., 234, 0) = 234
gettimeofday({1250893252, 887805}, NULL) = 0
write(3, "2009-08-21 17:20:52,887 - checks"..., 91) = 91
gettimeofday({1250893252, 888362}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 74) = 74
gettimeofday({1250893252, 888897}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 67) = 67
gettimeofday({1250893252, 889184}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 81) = 81
close(4)                                = 0
gettimeofday({1250893252, 889591}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 63) = 63
pipe([4, 5])                            = 0
pipe([6, 7])                            = 0
fcntl64(7, F_GETFD)                     = 0
fcntl64(7, F_SETFD, FD_CLOEXEC)         = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)
write(2, "Traceback (most recent call last"..., 35) = 35
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 52) = 52
open("/home/admin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/home/admin/sd-agent/dae"..., 60) = 60
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 54) = 54
open("/usr/lib/python2.4/sched.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/sched"..., 55) = 55
fstat64(8, {st_mode=S_IFREG|0644, st_size=4054, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "\"\"\"A generally useful event sche"..., 4096) = 4054
write(2, "    ", 4)                     = 4
write(2, "void = action(*argument)\n", 25) = 25
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 60) = 60
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 64) = 64
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 65) = 65
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "errread, errwrite)\n", 19)    = 19
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 71) = 71
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
read(8, "table(self, handle):\n           "..., 4096) = 4096
read(8, "rrno using _sys_errlist (or siml"..., 4096) = 4096
read(8, " p2cwrite = None, None\n         "..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "self.pid = os.fork()\n", 21)  = 21
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
write(2, "OSError", 7)                  = 7
write(2, ": ", 2)                       = 2
write(2, "[Errno 12] Cannot allocate memor"..., 33) = 33
write(2, "\n", 1)                       = 1
unlink("/var/run/sd-agent.pid")         = 0
close(3)                                = 0
munmap(0xb7e0d000, 4096)                = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x589978}, {0xb89a60, [], SA_RESTORER, 0x589978}, 8) = 0
brk(0xa022000)                          = 0xa022000
exit_group(1)                           = ?

1
'পাইপ' বা ফাইলডিজিপেক্টর বা এগুলির সাথে সম্পর্কিত কোনও কার্নেল-সংস্থান থেকে রান্নিগ?
ব্লুওহর

পরীক্ষা করুন /var/log/messages, বা dmesgআদেশ দিন।
চিহ্নিত করুন 4

এটিতে প্রাসঙ্গিক কোনও কিছুই নেই।
ডেভিডমিটটন

আপনি কি কখনও এর সমাধান পেয়েছেন? আমার খুব মিল রয়েছে। আমার প্রচুর অতিরিক্ত স্মৃতি রয়েছে, তবে অদলবদল যুক্ত করার পরে (আপনার উত্তরগুলির কয়েকটি এর মত), সমস্যাটি চলে যায়। আপনি এখন থেকে এখনকার মধ্যে মাসগুলিতে কিছু খুঁজে পেয়েছেন কিনা তা অবাক করেই ভাবছেন। - ধন্যবাদ!
dpb

আমি একই সমস্যার মধ্যে চলেছি কিন্তু কোন সমাধান নেই - কোন ধারণা?

উত্তর:


88

একটি সাধারণ নিয়ম (অর্থাত মধ্যে ভ্যানিলা কার্নেলের) হিসাবে, fork/ cloneসঙ্গে ব্যর্থতা ENOMEM বিশেষভাবে ঘটতে পারেন কারণ ঈশ্বরের কাছে একজন সৎ আউট-অফ-মেমরি শর্ত ( dup_mm, dup_task_struct,alloc_pid , mpol_dup, mm_initইত্যাদি অসন্তোষ প্রকাশ করা), অথবা কারণ security_vm_enough_memory_mmআপনি ব্যর্থ যখন প্রয়োগ overcommit নীতি

কাঁটাচামচ প্রচেষ্টার সময়, কাঁটাচামচ করতে ব্যর্থ হওয়া প্রক্রিয়াটির vmsize পরীক্ষা করে শুরু করুন এবং তারপরে ওভারকমিট নীতি সম্পর্কিত (মুক্ত নম্বরগুলি প্লাগ করুন) ফ্রি মেমরির পরিমাণ (শারীরিক এবং অদলবদল) এর সাথে তুলনা করুন)

আপনার বিশেষ ক্ষেত্রে, নোট করুন যে ভার্চুওজোও আছে প্রয়োগের অতিরিক্ত চেক রয়েছে । অধিকন্তু, আমি নিশ্চিত নই আপনি সত্যিই থেকে কত নিয়ন্ত্রণ মধ্যে আপনার ধারক, ওভার swap এবং overcommit কনফিগারেশন (ক্রম প্রয়োগকারী ফলাফল প্রভাবিত করার জন্য।)

এখন, প্রকৃতপক্ষে এগিয়ে যাওয়ার জন্য আমি বলতে চাই যে আপনি দুটি বিকল্প রেখে গেছেন :

  • আরও বড় উদাহরণে স্যুইচ করুন, বা
  • কিছু কোডিং প্রচেষ্টা রাখুন আপনার স্ক্রিপ্টের মেমরির পদচিহ্নকে আরও কার্যকরভাবে নিয়ন্ত্রণ করতে

লক্ষ করুন যে কোডিংয়ের প্রচেষ্টাটি সমস্ত কিছু হতে পারে যদি এটির প্রমাণিত হয় যে এটি আপনি নন তবে অন্য কিছু লোক একইভাবে সার্ভারে ভিন্ন ঘটনাতে ধাক্কা খেয়েছেন যেমন আপনি অ্যাম্বো চালিয়ে যাচ্ছেন।

স্মৃতিভিত্তিক, আমরা ইতিমধ্যে জানি যে ফণাটির নীচে / subprocess.Popenব্যবহারforkclone করে, যার অর্থ প্রতিবার আপনি যখন ফোন করবেন তখন আপনি পাইথনটি ইতিমধ্যে যতবার মেমোরিটি খাচ্ছেন ততক্ষণে , আরও শত শত অতিরিক্ত এমবিতে, তারপরে সমস্ত কিছু করার জন্যexec একটি শাস্তি 10 কেবি এক্সিকিউটেবল যেমন freeবা ps। একটি প্রতিকূল ওভার কমিট নীতি ক্ষেত্রে, আপনি শীঘ্রই দেখতে পাবেন ENOMEM

বিকল্প forkযে এই পিতা বা মাতা পেজ তালিকা ইত্যাদি হবে না সমস্যা কপি হয় vforkএবং posix_spawn। তবে আপনি যদি / এর subprocess.Popenনিরিখে আবার কিছু লেখার মতো মনে করেন না, তবে আপনার স্ক্রিপ্টের শুরুতে (যখন পাইথনের স্মৃতি পাদদেশ নূন্যতম হয়) কেবল একবার ব্যবহার করার কথা বিবেচনা করুন, তারপরে / / চালিত একটি শেল স্ক্রিপ্ট তৈরি করতেvforkposix_spawnsuprocess.Popenfreepssleep এবং যে কোনও কিছুই a আপনার স্ক্রিপ্টের সমান্তরাল লুপ ; স্ক্রিপ্টের আউটপুটটি পোল করুন বা এটি সুসংগতভাবে পড়ুন, সম্ভবত একটি পৃথক থ্রেড থেকে আপনার যদি অ্যাসিক্রোনালিভাবে যত্ন নেওয়ার মতো অন্য জিনিস থাকে - পাইথনে আপনার ডেটা ক্রাঞ্চিং করুন তবে অধস্তন প্রক্রিয়াটিতে কাঁপুন leave

তবুও , আপনার বিশেষ ক্ষেত্রে আপনি চলা psএবং freeসম্পূর্ণভাবে এড়িয়ে যেতে পারেন ; আপনি নিজে অ্যাক্সেস বেছে নিতে বা বিদ্যমান লাইব্রেরি এবং / অথবা প্যাকেজগুলির মাধ্যমে, পাইথন থেকে সরাসরিprocfs সেই তথ্য আপনার কাছে সহজেই উপলব্ধ । যদি এবং ছিল শুধুমাত্র ইউটিলিটি আপনি হচ্ছিল, তারপর আপনি করতে পারেন সঙ্গে দূরে না সম্পূর্ণরূপেpsfreesubprocess.Popen

অবশেষে, আপনি যতটা subprocess.Popenউদ্বিগ্ন হন না কেন আপনার স্ক্রিপ্টের মেমরি ফাঁস হয়ে গেলে আপনি অবশেষে প্রাচীরটিকে আঘাত করবেন hit এটি লক্ষ্য করুন, এবং মেমরি ফাঁস জন্য পরীক্ষা করুন


7
আমি দেখেছি যে চলমান gc.collect()ঠিক আগে subprocess.Popenক্ষেত্রেই সহায়তা করে যখন আবর্জনা সংগ্রাহক কিছুদিনের জন্য চালাতে না করেছে।
লেটমাইক

সহায়ক স্ক্রিপ্ট কৌশলটি পরিচালনা করার জন্য আমি একটি ডিমন লিখেছি: github.com/SananHayes/errand-boy আমি আমার ক্লায়েন্টদের সাথে এটির একটি উত্পাদন নিয়ে ব্যবহার করছি এবং আমাদের "মেমরি বরাদ্দ করতে পারি না" সমস্যাগুলি শেষ হয়ে গেছে।
সেন হেইস

আমি একটি সাধারণ ডায়াগনস্টিকের প্রশংসা করব, উদাহরণস্বরূপ, অতিরিক্ত কম /proc/fd/mapsমেমরিটি আসলে সমস্যাটি কিনা তা নির্ধারণ করার জন্য
দিমা তিস্নেক

18

এর আউটপুট তাকিয়ে free -m আমার কাছে মনে হয় যে আপনার কাছে আসলে অদলবদলের স্মৃতি উপলব্ধ নেই। আমি নিশ্চিত নই যে লিনাক্সে অদলবদল সর্বদা চাহিদার ভিত্তিতে স্বয়ংক্রিয়ভাবে উপস্থিত হবে কিনা তবে আমার একই সমস্যা ছিল এবং এখানে উত্তরগুলির সত্যিকার অর্থে কোনওটিই আমাকে সহায়তা করেনি। কিছুটা অদলবদল মেমরি যুক্ত করার পরেও সমস্যাটি আমার ক্ষেত্রে স্থির হয়েছে তাই এটি একই সমস্যার মুখোমুখি অন্যান্য লোকেদের সহায়তা করতে পারে তাই আমি কীভাবে 1 জিবি সোয়াপ যুক্ত করতে পারি তার উত্তরটি পোস্ট করি (উবুন্টু 12.04 তে তবে এটি অন্যান্য বিতরণের ক্ষেত্রেও একইভাবে কাজ করা উচিত))

কোনও অদলবদল মেমরি সক্ষম আছে কিনা তা আপনি প্রথমে পরীক্ষা করতে পারেন।

$sudo swapon -s

যদি এটি খালি থাকে তবে এর অর্থ আপনার কোনও স্যুপ সক্রিয় নেই। 1 জিবি অদলবদল যুক্ত করতে:

$sudo dd if=/dev/zero of=/swapfile bs=1024 count=1024k
$sudo mkswap /swapfile
$sudo swapon /swapfile

fstabঅদলবদল স্থায়ী করতে নিম্নলিখিত লাইনটি যুক্ত করুন ।

$sudo vim /etc/fstab

     /swapfile       none    swap    sw      0       0 

উত্স এবং আরও তথ্য এখানে পাওয়া যাবে


1
এটি কি একই সমস্যা বা অন্য কিছু সমাধান করেছে?
দিমা তিসনেক 14'15

এটি CentOS 6.4 এ আমার জন্য করেছে। অস্টাস্টগুলি ইনস্টল করার সময় ত্রুটির মুখোমুখি, ধন্যবাদ।
রুসলান আবুজান্ট

যদিও এটি আমাকে কোডটি কার্যকর করতে দেয়, এটি আসলে সমস্যার সমাধান করে না, যা সম্ভবত আমি ব্যবহার করি এমন একটি লাইব্রেরিতে রয়েছে।
ফিল্মওয়েব

1
আপনি আমার সমস্যা সমাধান করেছেন। ধন্যবাদ! +1
স্কিরিরাস

8

অদলবদল পূর্বে প্রস্তাবিত রেড হেরিং নাও হতে পারে। ঠিক এর ঠিক আগে অজগর প্রক্রিয়াটি কত বড় প্রশ্নENOMEM ?

কার্নেল ২. Under এর অধীনে, কার্নেলটি /proc/sys/vm/swappinessকীভাবে আক্রমণাত্মকভাবে অদলবদল হয়ে যাবে তা নিয়ন্ত্রণ করে এবং কার্নেলটি overcommit*কতটা এবং কতটা স্পষ্টভাবে উইঙ্ক এবং নোডের সাহায্যে মেমরি ভাগ করতে পারে। আপনার ফেসবুক সম্পর্কের স্থিতির মতো এটি জটিল

... তবে অদলবস্তু আসলে চাহিদা অনুসারে উপলব্ধ (ওয়েব হোস্ট অনুসারে) ...

তবে আপনার free(1)কমান্ডের আউটপুট অনুসারে নয় , যা আপনার সার্ভার উদাহরণ হিসাবে স্বীকৃত কোনও অদলবদল প্রদর্শন করে না। এখন, আপনার ওয়েব হোস্ট অবশ্যই এই বিষয় সম্পর্কে আমার চেয়ে অনেক বেশি জানতে পারে, তবে ভার্চুয়াল আরএইচএল / সেন্টোস সিস্টেমগুলি আমি ব্যবহার করেছি অতিথি ওএসের জন্য অদলবদল উপলব্ধ।

অভিযোজিত রেড হ্যাট কিলোবাইট ধারা 15252 :

অজ্ঞাত মেমরি এবং সিস্টেম ভি ভাগ করে নেওয়া মেমরির যোগফল র‌্যামের পরিমাণ প্রায় 3/4 এর চেয়ে কম হওয়া অবধি কোনও রেড হ্যাট এন্টারপ্রাইজ লিনাক্স 5 সিস্টেম অদলবদল স্থান ছাড়াই ঠিকঠাক চলবে। .... 4 গিগাবাইট র‌্যাম বা তারও কম সিস্টেমগুলির সাথে [ কমপক্ষে 2 জিবি স্বাপের স্থানের প্রস্তাব দেওয়া হয়]

আপনার /proc/sys/vmসেটিংসকে একটি সরল CentOS 5.3 ইনস্টলেশন সাথে তুলনা করুন । একটি সোয়াপ ফাইল যুক্ত করুন। র‌্যাচেট ডাউন করুন swappinessএবং দেখুন আপনি আর বাঁচেন কিনা।


পাইথন প্রক্রিয়াটির আকার চেক করার সর্বোত্তম উপায় কী? পুনশ্চ?
ডেভিডমিটটন

ps -o user,pid,vsz="Mem(Kb)" -o cmd $PYTHON_PIDশীর্ষ বা (1) এর মতো কিছু করা উচিত।
পাইলক্রো

7

একটি সহজ ফিক্স জন্য, আপনি পারে

echo 1 > /proc/sys/vm/overcommit_memory

যদি আপনি নিশ্চিত হন যে আপনার সিস্টেমে পর্যাপ্ত মেমরি রয়েছে। দেখুন লিনাক্স উপর অনুসন্ধানমূলক কমিট


1
তোমাকে অনেক ধন্যবাদ! এমন একটি সহজ সমাধান, আপনি আমার দিনটি সংরক্ষণ করেছেন)
igolkotek

5

আমি সন্দেহ করেই চলেছি যে আপনার গ্রাহক / ব্যবহারকারীর কিছু কার্নেল মডিউল বা ড্রাইভার লোড রয়েছে যা clone()সিস্টেম কল ( যা কিছু অস্পষ্ট সুরক্ষা বর্ধন, এলআইডিএস এর মতো কিছু তবে আরও অস্পষ্ট?) বা কোনওভাবে কার্নেল ডেটা কাঠামো পূরণ করছে যা হস্তক্ষেপ করছে that পরিচালনা করতে fork()/ clone()পরিচালনা করার জন্য প্রয়োজনীয় (প্রক্রিয়া সারণী, পৃষ্ঠা সারণী, ফাইল বিবরণী সারণী, ইত্যাদি)।

fork(2)ম্যান পৃষ্ঠার প্রাসঙ্গিক অংশটি এখানে :

ত্রুটি
       EAGAIN কাঁটাচামচ () পিতামাতার পৃষ্ঠার টেবিলগুলি অনুলিপি করার জন্য পর্যাপ্ত মেমরি বরাদ্দ করতে পারে না এবং এর জন্য একটি কার্য কাঠামো বরাদ্দ করতে পারে
              সন্তান।

       EAGAIN একটি নতুন প্রক্রিয়া তৈরি করা সম্ভব হয়নি কারণ কলারের আরএলআইএমআইএনএনপ্রোসি রিসোর্স সীমা ছিল। প্রতি
              এই সীমাটি ছাড়িয়ে গেলে, প্রক্রিয়াটির অবশ্যই CAP_SYS_ADMIN বা CAP_SYS_RESOURCE ক্ষমতা থাকতে হবে।

       ENOMEM কাঁটাচামচ () প্রয়োজনীয় কার্নেল কাঠামো বরাদ্দ করতে ব্যর্থ হয়েছে কারণ মেমরিটি শক্ত।

আমি পরামর্শ দিচ্ছি যে স্টক, জেনেরিক কার্নেল এ বুট করার পরে এবং কেবলমাত্র একটি মডিউল এবং ড্রাইভারের ন্যূনতম সেট সহ লোড করা (আপনার অ্যাপ্লিকেশন / স্ক্রিপ্টটি চালানোর জন্য ন্যূনতম প্রয়োজনীয়) ব্যবহার করা উচিত। সেখান থেকে, ধরে নেওয়া ধরে যে এটি সেই কনফিগারেশনে কাজ করে, তারা সমস্যাটি প্রদর্শন করে এমন কনফিগারেশনের মধ্যে একটি বাইনারি অনুসন্ধান করতে পারে। এটি হ'ল স্ট্যান্ডার্ড সিসাদমিন ট্রাবলশুটিং 101।

আপনার প্রাসঙ্গিক লাইনটি straceহ'ল:

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)

... আমি জানি অন্যরা অদলবদল এবং মেমরির প্রাপ্যতা সম্পর্কে কথা বলেছে (এবং আমি আপনাকে সুপারিশ করব যে আপনি কমপক্ষে একটি ছোট অদলবদল বিভাজক সেট আপ করুন, র‌্যাম ডিস্কে থাকা সত্ত্বেও ... লিনাক্স কার্নেলের সাথে কোড পাথ রয়েছে যখন এটি রয়েছে এমনকি স্বল্প পরিমাণে অদলবদলগুলি (ব্যতিক্রম হ্যান্ডলিং পাথগুলি) যেখানে শূন্যের অদলবদল উপলব্ধ রয়েছে তার চেয়ে অনেক বেশি ব্যায়াম করা হয়েছে।

তবে আমি সন্দেহ করি যে এটি এখনও একটি রেড হেরিং।

freeক্যাশে এবং বাফারদের দ্বারা 0 (জেরো) মেমরির ব্যবহারের ক্ষেত্রে মেমোরির প্রতিবেদন করা ঘটনাটি খুব বিরক্তিকর। আমি সন্দেহ করি যে freeআউটপুট ... এবং সম্ভবত আপনার অ্যাপ্লিকেশন সমস্যাটি এখানে কিছু মালিকানাধীন কার্নেল মডিউল দ্বারা তৈরি হয়েছে যা কোনওভাবে মেমরির বরাদ্দে হস্তক্ষেপ করছে।

কাঁটা () / ক্লোন () এর ম্যান পেজ অনুসারে কাঁটাচামচ () সিস্টেম কলটি যদি EGAIN ফিরে আসে তবে আপনার কলটি যদি কোনও রিসোর্স সীমা লঙ্ঘনের কারণ হয়ে দাঁড়ায় (RLIMIT_NPROC) ... তবে, এটি EagAIN ফিরিয়ে দিতে হবে কিনা তা বলে না অন্যান্য আরএলএমটি * * লঙ্ঘন দ্বারা। যে কোনও ইভেন্টে যদি আপনার টার্গেট / হোস্টের কিছু ধরণের অদ্ভুত ভর্মেট্রিক বা অন্যান্য সুরক্ষা সেটিংস থাকে (বা এমনকি আপনার প্রক্রিয়াটি কিছু অদ্ভুত সেলইনাক্স নীতিমালার অধীনে চলতে থাকে) তবে এটি সম্ভবত এই ব্যর্থতার কারণ হতে পারে।

মিল-লিনাক্স / ইউনিক্স ইস্যুতে এটি সাধারণ রান হওয়ার সম্ভাবনা খুব কম unlikely আপনার সেখানে অ-মানক কিছু চলছে।


1
সার্ভারটি মিডিয়া টেম্পলেট (ডিভি) বেসে চলছে যা ভার্চুয়ালাইজেশনের জন্য ভার্চুওজো ব্যবহার করে।
ডেভিডমিটটন

ভার্চুযজো মেসেজ বোর্ড এবং বাগ ট্র্যাকিং সিস্টেম অনুসন্ধান করার চেষ্টা করুন এবং সম্ভবত ভার্চুজ্জো সাবসিস্টেমেই আপগ্রেড খুঁজছেন।
জিম ডেনিস

2

আপনি কি ব্যবহার করে চেষ্টা করেছেন:

(status,output) = commands.getstatusoutput("ps aux")

আমি ভেবেছিলাম এটি আমার জন্য ঠিক একই সমস্যাটি স্থির করেছে। তবে তারপরে আমার প্রক্রিয়া শেষ না হয়ে পরিবর্তে মারা যাওয়া শেষ হয়ে গেল, যা আরও খারাপ ..

কিছু পরীক্ষার পরে আমি দেখতে পেলাম যে এটি কেবল পাইথনের পুরানো সংস্করণগুলিতেই ঘটেছিল: এটি ২.6.৫ দিয়ে ঘটে তবে ২.7.২ দিয়ে নয়

আমার সন্ধান আমাকে পাইথন-ক্লোজ_ফ্ডস-ইস্যু নিয়ে এসেছিল , তবে ক্লোজড_ফডিএস সেট না করে সমস্যার সমাধান করতে পারেনি। এটি এখনও পড়া ভাল।

আমি দেখতে পেয়েছি যে পাইথন কেবলমাত্র তার উপর নজর রেখে ফাইল বর্ণনাকারীদের ফাঁস করছে:

watch "ls /proc/$PYTHONPID/fd | wc -l"

আপনার মত আমিও কমান্ডের আউটপুট ক্যাপচার করতে চাই এবং আমি ওওএম এর ত্রুটিগুলি এড়াতে চাই ... তবে মনে হচ্ছে একমাত্র উপায় লোকেরা পাইথনের কম বগি সংস্করণ ব্যবহার করবে। আদর্শ নয় ...


0

মুনম্যাপ (0xb7d28000, 4096) = 0
লিখুন (2, "ওএসরর", 7) = 7

আমি opালু কোড দেখেছি যা দেখতে এরকম দেখাচ্ছে:

serrno = errno;
some_Syscall(...)
if (serrno != errno)
/* sound alarm: CATROSTOPHIC ERROR !!! */

অজগর কোডে এটি কি ঘটছে তা দেখার জন্য আপনার পরীক্ষা করা উচিত। প্রবর্তনকারী সিস্টেম কল ব্যর্থ হলেই এর্নো বৈধ।

যুক্ত করতে সম্পাদিত:

আপনি বলবেন না যে এই প্রক্রিয়াটি কত দিন বেঁচে থাকে। স্মৃতির সম্ভাব্য গ্রাহক

  • নকল প্রক্রিয়া
  • অব্যবহৃত ডাটা স্ট্রাকচার
  • ভাগ লাইব্রেরি
  • মেমরি ম্যাপযুক্ত ফাইল

2
হ্যাঁ, তবে আমরা ওপি'র স্ট্রেস থেকে দেখি যে ক্লোন () থেকে - প্রথম সিস্কেল ব্যর্থতা হ'ল এনওএমইএম। সি-লাইব্রেরিটি errnoপথে বহুবার রিসেট করা হলেও এই ত্রুটিটি পাইথনের কম স্মৃতিতে ট্রেসব্যাক নির্মাণের মাধ্যমে হোঁচট খায় ।
পাইলক্রো

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.