ams-han-decoder icon indicating copy to clipboard operation
ams-han-decoder copied to clipboard

Possible memory leak

Open andwaal opened this issue 6 years ago • 2 comments

Hi First of all thanks for a good program!

After a couple of days running this on my Rpi3 it stopped sending data to HA and I was not able to SSH into the instance. The PI is a fresh install only running this service.

In syslog I found these:

Sep 13 22:47:45 raspberrypi ams_han_decoder.pl[245]: Decoding HDLC frame failed: Can't pipe to  mosquitto_pub -h 192.168.10.69 -s -t sensor/ams: Cannot allocate memory at /home/pi/ams-han-decoder/ams_han_decoder.pl line 115.
Sep 13 22:47:45 raspberrypi ams_han_decoder.pl[245]: #011main::send_json("{\x{a}   \"data\" : {\x{a}      \"power_active_import\" : {\x{a}         \"des"...) called at /home/pi/ams-han-decoder/ams_han_decoder.pl line 434
Sep 13 22:47:45 raspberrypi ams_han_decoder.pl[245]: #011main::decode_hdlc_frame("\x{a0}*A\x{8}\x{83}\x{13}\x{4}\x{13}\x{e6}\x{e7}\x{0}\x{f}\@\x{0}\x{0}\x{0}\x{0}\x{1}\x{1}\x{2}\x{3}\x{9}\x{6}\x{1}\x{0}\x{1}\x{7}\x{0}\x{ff}\x{6}\x{0}\x{0}\x{5}\x{da}\x{2}\x{2}\x{f}\x{0}\x{16}\x{1b}J\x{ad}", 42, 0, 10) called at /home/pi/ams-han-decoder/ams_han_decoder.pl line 189
Sep 13 22:47:45 raspberrypi ams_han_decoder.pl[245]: #011eval {...} called at /home/pi/ams-han-decoder/ams_han_decoder.pl line 189
Sep 13 22:47:45 raspberrypi ams_han_decoder.pl[245]: #011main::parse_stream(GLOB(0x1f61648)) called at /home/pi/ams-han-decoder/ams_han_decoder.pl line 83
Sep 13 22:47:47 raspberrypi ams_han_decoder.pl[245]: Decoding HDLC frame failed: Can't pipe to  mosquitto_pub -h 192.168.10.69 -s -t sensor/ams: Cannot allocate memory at /home/pi/ams-han-decoder/ams_han_decoder.pl line 115.
Sep 13 22:47:47 raspberrypi ams_han_decoder.pl[245]: #011main::send_json("{\x{a}   \"data\" : {\x{a}      \"power_active_import\" : {\x{a}         \"des"...) called at /home/pi/ams-han-decoder/ams_han_decoder.pl line 434

The program is running as a service in systemd:

[Unit]
Description=AMS HAN decoder

[Service]
Environment=HOME=/home/pi
ExecStart= /home/pi/ams-han-decoder/ams_han_decoder.pl -m AIDON_V0001 -p ' mosquitto_pub -h 192.168.10.69 -s -t sensor/ams' /dev/ttyUSB0

[Install]
WantedBy=multi-user.target

After rebooting I then watched the processes in htop and could see the memory use of the service stedely raising, which leads me to the conclution that that a memory leak is the reason behind my crash.

I was able to solve this by adding auto restart of the service in systemd, but this should not be needed.

So the "working" systemd service now looks like this

[Unit]
Description=AMS HAN decoder

[Service]
Environment=HOME=/home/pi
ExecStart= /home/pi/ams-han-decoder/ams_han_decoder.pl -m AIDON_V0001 -p ' mosquitto_pub -h 192.168.10.69 -s -t sensor/ams' /dev/ttyUSB0
Restart=always
RuntimeMaxSec=3600

[Install]
WantedBy=multi-user.target

andwaal avatar Sep 14 '19 12:09 andwaal

@andwaal I've confirmed the issue as well, but I used the method mentioned in the README (systemd memory limit) to keep it under control.

The -k parameter helps mitigate the issue somewhat, as the issue occurs when the program mentioned by the -p parameter is executed/forked. If you don't use the -p parameter at all, then I think the issue shouldn't happen.

If you don't use -p then you'll have to find another way to pipe STDOUT (the JSON data) where you want it. If you come up with a better systemd unit file for doing that, then I'm very interested.

Finally, if you're able to figure out where the memory leak is actually coming from I would very much like to know.

robinsmidsrod avatar Aug 25 '20 15:08 robinsmidsrod

@andwaal Are you still seeing this issue if you use the built-in MQTT client?

robinsmidsrod avatar Dec 14 '24 15:12 robinsmidsrod