Bug#1142815: libipc-shareable-perl: autopkgtest uses insane amount of memory on loong64

Edmund Lodewijks edmund at proteamail.com
Thu Aug 27 17:23:38 BST 2026


On Thu, 27 Aug 2026 14:52:41 +0200 gregor herrmann <gregoa at debian.org> 
wrote:
> (And I hope smeone else will come along and "just fix" this package 
> :))

Hi all,

Okay, I had a stab at this. I looked at IPC-Shareable-1.19/t/47-seg_size.t.

My background is rather in C, and I have never written any Perl, so for 
the patch, I will happily leave that to the Perl devs here. Therefore, I 
am afraid, no "just fix" solution; but still the cause and a write-up 
for a patch.

## The Root Cause

The test has a "beyond RAM limits" block that passes `limit => 0` to 
bypass internal module checks, and intentionally requests an 
"impossible" 999,999,999,999-byte (~1 TB) segment, expecting the OS to 
refuse it.

- On non-Linux systems (macOS, BSD), this works, because they enforce 
small, strict default SHMMAX ceilings (e.g., 4 MB to 512 MB).
- On Linux, the default `kernel.shmmax` is effectively unlimited 
(`ULONG_MAX - 2**24` - check `/proc/sys/kernel/shmmax`). Therefore, 
`shmget()` falls through to the standard overcommit heuristic in 
`__vm_enough_memory()`, which only rejects segments that exceed MemTotal 
+ SwapTotal.
- On large infrastructure nodes where RAM + swap exceeds 1 TB, the 
kernel grants the segment lazily. When `SharedMem.pm` subsequently 
performs a `shmread()` to inspect the segment, it forces two massive 
physical allocations simultaneously: a 1 TB Perl scalar heap allocation 
for the read buffer, and the physical materialisation of the 1 TB 
zero-filled shared memory segment via page faults. This results in an 
immediate 2 TB memory footprint spike, causing the test runner to be killed.

Paul's numbers confirm this.

Paul reported a virtual size of 1,953,147,760 KiB for `/usr/bin/perl 
t/65-seg_size.t` on line 601. When converted, that is exactly 
2,000,023,306,240 bytes. Against the 1 TB target request, this maps 
almost cleanly to a 2.0000x multiplier. The remaining ~22 MB is also to 
be found in Paul's message: `/usr/bin/perl /usr/bin/prove` on line 463 
shows a virtual size of 22240 KiB = 22.19 MiB.

## Proposed Fix Architecture

Rather than relying on a hardcoded "impossible" size that modern server 
hardware can easily accommodate, the test script (t/47-seg_size.t) 
should calculate a dynamic refusal ceiling at runtime:

1. Keep a baseline fallback: Define a static constant of 999999999999 
bytes (~1 TB) as the default choice for non-Linux architectures.
2. Handle a lowered Linux shmmax (if defined): On Linux, check 
`/proc/sys/kernel/shmmax`. If a system administrator has manually set it 
to a value lower than 1 TB, keep the 1 TB test size, as the OS will 
already safely reject it.
3. Account for Overcommit Mode 1: Check 
`/proc/sys/vm/overcommit_memory`. If it is set to 1 (always overcommit), 
the kernel will never reject an allocation at creation time. In this 
case, cleanly skip the two test assertions to prevent a guaranteed 
out-of-memory crash.
4. Compute a dynamic ceiling via `meminfo`: If overcommit is in standard 
mode, parse `/proc/meminfo` to read MemTotal and SwapTotal. Calculate a 
new target size equivalent to MemTotal + SwapTotal + 1 GB (adding 1 GB 
to safely clear page-alignment rounding bounds). Use this computed size 
for the tie operation to guarantee an immediate application-layer or 
kernel-level refusal without initialising any real memory blocks.
5. Enforce defensive container fallbacks: Ensure that all file-read 
operations on `/proc` files fail gracefully (returning the 1 TB baseline 
fallback) if executed inside locked-down sandbox environments, Distrobox 
environments, or strict container runtimes where `/proc` access is 
restricted.

This runtime logic completely avoids hardcoding architecture-specific 
blacklists, cleanly accommodates modern high-memory hardware 
configurations, and prevents sudden worker terminations.

     Edmund


-- 
Edmund Lodewijks <edmund at proteamail.com>
TZ: UTC+2 / GMT+2

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 236 bytes
Desc: OpenPGP digital signature
URL: <http://alioth-lists.debian.net/pipermail/pkg-perl-maintainers/attachments/20260827/ccb57177/attachment.sig>


More information about the pkg-perl-maintainers mailing list