我编写了一个小程序,使用MinimalModbus在串口上收集数据。数据将被转储到CSV文件中。我已经阅读了SO和其他地方的几篇文章。一些提到的事情是:
1. 尽可能使用惰性求值(xrange而不是range) 2. 删除未使用的大对象 3. 使用子进程,当它们死亡时,操作系统会释放内存
该脚本可在github上找到此处。我还使用脚本定期上传这些文件到服务器。这两个脚本都相当简单。此外,系统上没有运行其他任何程序,因此我认为只有内存占用问题。
如何解决这个问题才是最好的方式?我并不愿意采用子进程。
一些更多的信息:
1. 数据收集在树莓派上进行(512 MB RAM) 2. Python版本:2.7 3. 大约需要3-4天内存就会完全使用,之后树莓派就会冻结
我遵循了这篇指南,找出占用RAM最多的前20个程序。
以下是top命令的输出结果。
1. 尽可能使用惰性求值(xrange而不是range) 2. 删除未使用的大对象 3. 使用子进程,当它们死亡时,操作系统会释放内存
该脚本可在github上找到此处。我还使用脚本定期上传这些文件到服务器。这两个脚本都相当简单。此外,系统上没有运行其他任何程序,因此我认为只有内存占用问题。
如何解决这个问题才是最好的方式?我并不愿意采用子进程。
一些更多的信息:
1. 数据收集在树莓派上进行(512 MB RAM) 2. Python版本:2.7 3. 大约需要3-4天内存就会完全使用,之后树莓派就会冻结
我遵循了这篇指南,找出占用RAM最多的前20个程序。
$ ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 20
12434 2.2 python
12338 1.2 python
2578 0.8 /usr/sbin/console-kit-daemon
30259 0.7 sshd:
30283 0.7 -bash
1772 0.6 /usr/sbin/rsyslogd
2645 0.6 /usr/lib/policykit-1/polkitd
2146 0.5 dhclient
1911 0.4 /usr/sbin/ntpd
12337 0.3 sudo
12433 0.3 sudo
1981 0.3 sudo
30280 0.3 sshd:
154 0.2 udevd
16994 0.2 /usr/sbin/sshd
17006 0.2 ps
1875 0.2 /usr/bin/dbus-daemon
278 0.2 udevd
290 0.2 udevd
1 0.1 init
因此,这两个Python进程占用了一些RAM,但与总RAM消耗相比非常小。以下是free命令的输出。
pi@raspberrypi ~ $ free -m
total used free shared buffers cached
Mem: 438 414 23 0 45 320
-/+ buffers/cache: 48 389
Swap: 99 0 99
以下是top命令的输出结果。
Tasks: 69 total, 1 running, 68 sleeping, 0 stopped, 0 zombie
%Cpu(s): 66.9 us, 5.0 sy, 0.0 ni, 18.1 id, 0.0 wa, 0.0 hi, 10.0 si, 0.0 st
KiB Mem: 448776 total, 429160 used, 19616 free, 47016 buffers
KiB Swap: 102396 total, 0 used, 102396 free, 332288 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12338 root 20 0 10156 5644 2384 S 69.8 1.3 3059:31 python
26039 root 20 0 0 0 0 S 1.6 0.0 0:02.71 kworker/0:1
26863 pi 20 0 4664 1356 1028 R 1.3 0.3 0:00.12 top
1982 root 20 0 1752 516 448 S 0.3 0.1 1:08.36 sh
1985 root 20 0 1692 552 460 S 0.3 0.1 5:15.16 startpar
1 root 20 0 2144 728 620 S 0.0 0.2 0:17.43 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.14 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:13.20 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0H
8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
12 root 20 0 0 0 0 S 0.0 0.0 0:00.06 bdi-default
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
编辑2
如第一个答案所建议的那样,我决定查看日志文件。我查看了syslog文件,并在其末尾得到了以下结果。
May 19 10:03:26 raspberrypi wpa_supplicant[7065]: wlan0: Failed to initialize driver interface
May 19 10:03:49 raspberrypi wpa_supplicant[7157]: nl80211: 'nl80211' generic netlink not found
May 19 10:03:49 raspberrypi wpa_supplicant[7157]: Failed to initialize driver 'nl80211'
May 19 10:03:49 raspberrypi wpa_supplicant[7157]: rfkill: Cannot open RFKILL control device
May 19 10:03:49 raspberrypi wpa_supplicant[7157]: Could not read interface wlan0 flags: No such device
这些消息正在填充日志文件,每秒钟都会出现。有趣的是,我正在使用以太网而不是WiFi。
因此,现在不清楚RAM去了哪里?