Articles of 内存

Python打开一个文件,正在读取它的数据,为什么python仍然可以读取它的数据,即使我删除这个文件?

我的python程序是从txt文件中读取数据并将数据插入到我的postgre数据库中。 该程序已经开始并继续运行。 然后我不小心删除了磁盘上的文件,但程序仍然继续运行,并将数据插入数据库。 那是因为当python打开一个文件时,它将文件加载到内存中,这样即使我删除了磁盘上的文件,也不会影响正在运行的程序吗? 但是我的文件超过3GB,python是否真的把我的文件加载到内存中? 我担心数据库中的数据是否正确。 这是我的代码,打开文件: f = open("/home/minjian/Documents/tweets2009-07.txt") 我的操作系统是: Linux minjian-OptiPlex-9020 3.16.0-46-generic #62~14.04.1-Ubuntu SMP Tue Aug 11 16:27:16 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

什么导致MySQL交换使用,并最终oom_killer

我们正在努力解决前几天出现的问题。 oom_killer开始杀死mysqld并报告完整的内存和交换使用情况。 系统应该有足够的内存供mysql在不交换的情况下运行。 任何深入了解为什么内存消耗比innodb_buffer_pool_size更多将高度赞赏? CentOS 7.2.1511 x86_64 MariaDB 10.1.17 x86_64 150GB内存8个CPU VMWare vSphere 6 my.cnf中 [MYSQLD] # Added for xtrabackup innodb_data_file_path=ibdata1:1000M:autoextend user=mysql basedir=/usr/ datadir=/var/lib/mysql/data tmpdir=/var/lib/mysql/tmp ignore-db-dirs=lost+found socket=/var/lib/mysql/mysql.sock pid-file=mysqld.pid port=3306 log-error=error.log slow_query_log=1 long_query_time=10 log-queries-not-using-indexes=1 ### INNODB OPTIONS innodb-buffer-pool-size=110G # Used to be 124GB which has worked for a long time innodb-flush-log-at-trx-commit=2 innodb-file-per-table=1 innodb-data-file-path = ibdata1:1000M:autoextend ## […]

通过分叉减轻内存泄漏

这是一个非常难看的问题。 我有一个C ++程序,它在循环中执行以下操作: 等待JMS消息 计算一些数据 作为回应发送JMS消息 我的程序(我们称之为“鲍勃”)有一个相当严重的内存泄漏。 内存泄漏位于别人编写的共享库中,我必须使用它,但是我无法访问的源代码。 该内存泄漏导致Bob在循环的“计算某些数据”阶段期间崩溃。 这是一个问题,因为另一个程序正在等待Bob的响应,如果它没有收到响应,将会很不高兴。 由于各种限制(是的,这是一个X / Y的问题,我告诉你这是丑陋的),我已经确定,我唯一可行的策略是修改鲍勃,以便它在循环中执行以下操作: 等待JMS消息 计算一些数据 作为回应发送JMS消息 检查是否有使用“太多”内存的危险 如果是这样,叉子和高pipe自己的副本,并优雅地退出 我的问题如下: 什么是最好(可靠但不是太低效)的方法来检测我们是否使用“太多”的内存? 我目前的想法是比较getrlimit(RLIMIT_AS) rlim_cur和getrusage(RUSAGE_SELF) ru_maxrss ; 那是对的吗? 如果不是,那么更好的办法是什么? Bob在各种主机上的Linux VM上运行,所有主机都有不同的内存量。

Linux:如何获得进程使用的交换?

获取驻留集大小非常简单( getrusage()或/proc/self/statm ),但是如何获得交换量? 从man 5 proc about / proc / self / stat: nswap %lu Number of pages swapped (not maintained). cnswap %lu Cumulative nswap for child processes (not maintained). 任何其他的想法?

init和bashterminal进程之间的关系

每当我们打开一个terminal,内核创build一个进程(bash-terminal使用fork + exec),它的父进程是“init”。 但是,这个“mate-terminal”成为父母,并创build另一个用户可视化的过程“terminal”。 只是想知道“init”(pid = 1,ppid = 0),“mate-terminal”(pid = 200和ppid = 1)和“terminal”(pid = 1)之间共享什么types的文件描述符, 201和ppid = 200)。 我知道这个过程栈以及哪些段被共享,但在这个实际的场景中无法清晰地显示。 请帮助我理解这个过程的内存语义。 任何帮助,欢迎..

是python2不情愿释放内存?

我知道python有自己的内存pipe理实现使用areans为不同大小的对象和更多,虽然我还没有find一个彻底的文档。 不过,我想了解发生了什么。 背景是一个长期运行的python2数据库应用程序,它以某种方式出现泄漏内存,它运行在64位linux上。 这个应用程序每天都会从数据库中读取一些数据,为了读取这些行(使用MySQLdb),总共需要大约3.5GB的内存使用量。 大约有3.5M行,之后减less到几百行,其余的已经超出了范围(“释放”)。 但是python-2.7只能释放现在“未使用”内存的一小部分。 我很期待内存被重用,但是我观察到,这种内存似乎“慢慢地泄漏”了。 所提到的数据库应用程序每天都会读取这个庞大的数据。 连续读取两次(或更多次)只为第一次读取分配内存,然后显然重新使用这个内存。 但是让它运行几个小时然后再读取DB数据会产生下一个3 + GB的内存分配高峰(它永远不会被释放)。 为了添加更多的背景(并且让事情更糟糕来解释),我不得不说这个数据库应用程序不是空闲的,而是永久执行任务。 我非常确定从监视内存使用情况(nagios性能数据),内存使用永远不会攀升到3.5GB内存(甚至closures),没有这个特定的数据库查询。 但启用此查询,每天增加3 + GB的RAM。 有问题的查询返回大部分唯一的整数和浮点数。 这是我开始怀疑python的主要原因。 我觉得我已经读了大量的信息,看着_PyObject_DebugMallocStats(),但不知道什么(或为什么)python决定保持几千兆字节。 它归结为一个非常简单的例子(并不代表关于数据的真实情况,我知道xrange()): def mem_usage(pid=None): mem = 0 proc = str(pid or "self") with open("/proc/%s/smaps" % proc) as fstat: for l in fstat: if not l.startswith("Private_"): continue mem += int(l.split(":", 1)[1].strip().split(" ", 1)[0]) return mem mem_usage() # […]

如何检查内存区域是否映射到文件?

有没有办法检查内存区域是否使用mmap映射到底层文件? 我的意思是我想写一个函数: int is_mmapped(void *ptr, size_t length); 对于使用mmap syscall完全映射到文件的内存区域,它将返回非零值。

如何在Linux上进行分配时logging堆栈?

在OS X上,在运行程序之前设置MallocStackLogging环境variables将导致malloc(3)和free(3)每次调用每个内存区域时logging堆栈。 这对于debugging内存损坏问题特别有用,因为您可以回顾已损坏的区域的历史logging,并找出哪部分代码是应该对内存负责。 我知道我可以在Linux上使用__malloc_hook来编写我自己的debugging工具的实现,但是我想知道是否没有更简单的方法来完成同样的事情? 在Linux上跟踪分配的build议方式是什么?

OpenCL – 如果GPU内存大于系统RAM,会发生什么情况

我们有一个opencl应用程序比在一台配有12 GB RAM的机器上运行单个nvidia C2075(6GB Mem)。 我们build立了一台配备12GB内存和AMD W9100 GPU(16GB内存)的新机器(通过运行简单的opencl应用程序确保一切正确)。 现在相同的opencl应用程序在新机器上崩溃。 我们发现在执行过程中,一些内存分配失败了。 将系统内存增加到24GB使应用程序工作。 (该应用程序工作在所有单片机内的GPU内存>系统内存,所有的机器都是SUSE Linux企业服务器64位) 你如何得出这种情况? 我认为GPU正在将其整个16GB映射到系统RAM上,导致内存不足。 但通过/ proc / iomem和lspci -v,我看不到一个16GB的窗口。 GPU真的将内存映射到系统内存吗? 谢谢您的帮助

如何findclojure + jvm 1.8中的内存“泄漏”

我的clojure应用程序在运行java 8的linux系统上显示出奇怪的行为。具体来说,当使用httpkit通过websockets与客户端进行通信时,内存占用显然没有限制 – 取决于系统,进程被操作系统httpkit 。 我研究了jconsole中的内存使用情况,显然,(新) metaspace不断增长。 我设法通过将-XX:MaxMetaspaceSize=128m传递给jar来解决这个问题:在这种情况下,每当它超过128m时,metaspace内存图就会减less,程序不会吃掉所有的内存。 但这是一个解决方法 – 我想了解为什么会发生这种增长,但我不知道如何继续。 在C ++中,我会用valgrind跟踪泄漏,但是由于Java / Clojure是垃圾收集,我不知道要寻找什么。 我不是100%确定它只是httpkit代码部分,但从我的testing看起来像这样 – 这是一个代码摘录,我正在侦听消息,并根据消息发送一个包含一些数据的json对象; coreparams-atom可以预计在任何时候都有大约10个浮点条目。 (httpkit/on-receive channel (fn [data] (let [data-map (json/read-str data) param (first (get data-map "data")) value (second (get data-map "data"))] (case (get data-map "type") ; … "curparams" (let [tosend (json/write-str {:type "curparams" :data (-> @state/coreparams-atom (assoc :timestamp (db/timestamp)) […]