Skip to content

Commit 70b4164

Browse files
ashutosh-bapatCommitfest Bot
authored andcommitted
WIP: Monitoring views
Modifies pg_shmem_allocations to report shared memory segment as well. Adds pg_shmem_segments to report shared memory segment information. TODO: This commit should be merged with the earlier commit introducing multiple shared memory segments. Author: Ashutosh Bapat
1 parent bb9c37f commit 70b4164

File tree

7 files changed

+108
-22
lines changed

7 files changed

+108
-22
lines changed

doc/src/sgml/system-views.sgml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4167,6 +4167,15 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx
41674167
</para></entry>
41684168
</row>
41694169

4170+
<row>
4171+
<entry role="catalog_table_entry"><para role="column_definition">
4172+
<structfield>segment</structfield> <type>text</type>
4173+
</para>
4174+
<para>
4175+
The name of the shared memory segment concerning the allocation.
4176+
</para></entry>
4177+
</row>
4178+
41704179
<row>
41714180
<entry role="catalog_table_entry"><para role="column_definition">
41724181
<structfield>off</structfield> <type>int8</type>

src/backend/catalog/system_views.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,13 @@ GRANT SELECT ON pg_shmem_allocations TO pg_read_all_stats;
658658
REVOKE EXECUTE ON FUNCTION pg_get_shmem_allocations() FROM PUBLIC;
659659
GRANT EXECUTE ON FUNCTION pg_get_shmem_allocations() TO pg_read_all_stats;
660660

661+
CREATE VIEW pg_shmem_segments AS
662+
SELECT * FROM pg_get_shmem_segments();
663+
664+
REVOKE ALL ON pg_shmem_segments FROM PUBLIC;
665+
GRANT SELECT ON pg_shmem_segments TO pg_read_all_stats;
666+
REVOKE EXECUTE ON FUNCTION pg_get_shmem_segments() FROM PUBLIC;
667+
GRANT EXECUTE ON FUNCTION pg_get_shmem_segments() TO pg_read_all_stats;
661668
CREATE VIEW pg_shmem_allocations_numa AS
662669
SELECT * FROM pg_get_shmem_allocations_numa();
663670

src/backend/storage/ipc/shmem.c

Lines changed: 72 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ ShmemInitStructInSegment(const char *name, Size size, bool *foundPtr,
531531
result->size = size;
532532
result->allocated_size = allocated_size;
533533
result->location = structPtr;
534+
result->shmem_segment = shmem_segment;
534535
}
535536

536537
LWLockRelease(ShmemIndexLock);
@@ -582,13 +583,14 @@ mul_size(Size s1, Size s2)
582583
Datum
583584
pg_get_shmem_allocations(PG_FUNCTION_ARGS)
584585
{
585-
#define PG_GET_SHMEM_SIZES_COLS 4
586+
#define PG_GET_SHMEM_SIZES_COLS 5
586587
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
587588
HASH_SEQ_STATUS hstat;
588589
ShmemIndexEnt *ent;
589-
Size named_allocated = 0;
590+
Size named_allocated[ANON_MAPPINGS] = {0};
590591
Datum values[PG_GET_SHMEM_SIZES_COLS];
591592
bool nulls[PG_GET_SHMEM_SIZES_COLS];
593+
int i;
592594

593595
InitMaterializedSRF(fcinfo, 0);
594596

@@ -598,33 +600,42 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS)
598600

599601
/* output all allocated entries */
600602
memset(nulls, 0, sizeof(nulls));
601-
/* XXX: take all shared memory segments into account. */
602603
while ((ent = (ShmemIndexEnt *) hash_seq_search(&hstat)) != NULL)
603604
{
604605
values[0] = CStringGetTextDatum(ent->key);
605-
values[1] = Int64GetDatum((char *) ent->location - (char *) Segments[MAIN_SHMEM_SEGMENT].ShmemSegHdr);
606-
values[2] = Int64GetDatum(ent->size);
607-
values[3] = Int64GetDatum(ent->allocated_size);
608-
named_allocated += ent->allocated_size;
606+
values[1] = CStringGetTextDatum(MappingName(ent->shmem_segment));
607+
values[2] = Int64GetDatum((char *) ent->location - (char *) Segments[ent->shmem_segment].ShmemSegHdr);
608+
values[3] = Int64GetDatum(ent->size);
609+
values[4] = Int64GetDatum(ent->allocated_size);
610+
named_allocated[ent->shmem_segment] += ent->allocated_size;
609611

610612
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc,
611613
values, nulls);
612614
}
613615

614616
/* output shared memory allocated but not counted via the shmem index */
615-
values[0] = CStringGetTextDatum("<anonymous>");
616-
nulls[1] = true;
617-
values[2] = Int64GetDatum(Segments[MAIN_SHMEM_SEGMENT].ShmemSegHdr->freeoffset - named_allocated);
618-
values[3] = values[2];
619-
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
617+
for (i = 0; i < ANON_MAPPINGS; i++)
618+
{
619+
values[0] = CStringGetTextDatum("<anonymous>");
620+
values[1] = CStringGetTextDatum(MappingName(i));
621+
nulls[2] = true;
622+
values[3] = Int64GetDatum(Segments[i].ShmemSegHdr->freeoffset - named_allocated[i]);
623+
values[4] = values[3];
624+
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
625+
}
620626

621627
/* output as-of-yet unused shared memory */
622-
nulls[0] = true;
623-
values[1] = Int64GetDatum(Segments[MAIN_SHMEM_SEGMENT].ShmemSegHdr->freeoffset);
624-
nulls[1] = false;
625-
values[2] = Int64GetDatum(Segments[MAIN_SHMEM_SEGMENT].ShmemSegHdr->totalsize - Segments[MAIN_SHMEM_SEGMENT].ShmemSegHdr->freeoffset);
626-
values[3] = values[2];
627-
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
628+
memset(nulls, 0, sizeof(nulls));
629+
630+
for (i = 0; i < ANON_MAPPINGS; i++)
631+
{
632+
nulls[0] = true;
633+
values[1] = CStringGetTextDatum(MappingName(i));
634+
values[2] = Int64GetDatum(Segments[i].ShmemSegHdr->freeoffset);
635+
values[3] = Int64GetDatum(Segments[i].ShmemSegHdr->totalsize - Segments[i].ShmemSegHdr->freeoffset);
636+
values[4] = values[3];
637+
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
638+
}
628639

629640
LWLockRelease(ShmemIndexLock);
630641

@@ -825,3 +836,46 @@ pg_numa_available(PG_FUNCTION_ARGS)
825836
{
826837
PG_RETURN_BOOL(pg_numa_init() != -1);
827838
}
839+
840+
/* SQL SRF showing shared memory segments */
841+
Datum
842+
pg_get_shmem_segments(PG_FUNCTION_ARGS)
843+
{
844+
#define PG_GET_SHMEM_SEGS_COLS 6
845+
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
846+
Datum values[PG_GET_SHMEM_SEGS_COLS];
847+
bool nulls[PG_GET_SHMEM_SEGS_COLS];
848+
int i;
849+
850+
InitMaterializedSRF(fcinfo, 0);
851+
852+
/* output all allocated entries */
853+
for (i = 0; i < ANON_MAPPINGS; i++)
854+
{
855+
PGShmemHeader *shmhdr = Segments[i].ShmemSegHdr;
856+
AnonymousMapping *segmapping = &Mappings[i];
857+
int j;
858+
859+
if (shmhdr == NULL)
860+
{
861+
for (j = 0; j < PG_GET_SHMEM_SEGS_COLS; j++)
862+
nulls[j] = true;
863+
}
864+
else
865+
{
866+
memset(nulls, 0, sizeof(nulls));
867+
values[0] = Int32GetDatum(i);
868+
values[1] = CStringGetTextDatum(MappingName(i));
869+
values[2] = Int64GetDatum(shmhdr->totalsize);
870+
values[3] = Int64GetDatum(shmhdr->freeoffset);
871+
values[4] = Int64GetDatum(segmapping->shmem_size);
872+
values[5] = Int64GetDatum(segmapping->shmem_reserved);
873+
}
874+
875+
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc,
876+
values, nulls);
877+
}
878+
879+
return (Datum) 0;
880+
}
881+

src/include/catalog/pg_proc.dat

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8568,8 +8568,8 @@
85688568
{ oid => '5052', descr => 'allocations from the main shared memory segment',
85698569
proname => 'pg_get_shmem_allocations', prorows => '50', proretset => 't',
85708570
provolatile => 'v', prorettype => 'record', proargtypes => '',
8571-
proallargtypes => '{text,int8,int8,int8}', proargmodes => '{o,o,o,o}',
8572-
proargnames => '{name,off,size,allocated_size}',
8571+
proallargtypes => '{text,text,int8,int8,int8}', proargmodes => '{o,o,o,o,o}',
8572+
proargnames => '{name,segment,off,size,allocated_size}',
85738573
prosrc => 'pg_get_shmem_allocations' },
85748574

85758575
{ oid => '4099', descr => 'Is NUMA support available?',
@@ -8592,6 +8592,14 @@
85928592
proargmodes => '{o,o,o}', proargnames => '{name,type,size}',
85938593
prosrc => 'pg_get_dsm_registry_allocations' },
85948594

8595+
# shared memory segments
8596+
{ oid => '5101', descr => 'shared memory segments',
8597+
proname => 'pg_get_shmem_segments', prorows => '6', proretset => 't',
8598+
provolatile => 'v', prorettype => 'record', proargtypes => '',
8599+
proallargtypes => '{int4,text,int8,int8,int8,int8}', proargmodes => '{o,o,o,o,o,o}',
8600+
proargnames => '{id,name,size,freeoffset,mapping_size,mapping_reserved_size}',
8601+
prosrc => 'pg_get_shmem_segments' },
8602+
85958603
# buffer lookup table
85968604
{ oid => '5102',
85978605
descr => 'shared buffer lookup table',

src/include/storage/pg_shmem.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ typedef struct ShmemSegment
6969
extern PGDLLIMPORT ShmemSegment Segments[ANON_MAPPINGS];
7070
extern PGDLLIMPORT AnonymousMapping Mappings[ANON_MAPPINGS];
7171

72-
7372
/* GUC variables */
7473
extern PGDLLIMPORT int shared_memory_type;
7574
extern PGDLLIMPORT int huge_pages;

src/include/storage/shmem.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ typedef struct
7171
void *location; /* location in shared mem */
7272
Size size; /* # bytes requested for the structure */
7373
Size allocated_size; /* # bytes actually allocated */
74+
int shmem_segment; /* segment in which the structure is allocated */
7475
} ShmemIndexEnt;
7576

7677
#endif /* SHMEM_H */

src/test/regress/expected/rules.out

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1764,14 +1764,22 @@ pg_shadow| SELECT pg_authid.rolname AS usename,
17641764
LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))))
17651765
WHERE pg_authid.rolcanlogin;
17661766
pg_shmem_allocations| SELECT name,
1767+
segment,
17671768
off,
17681769
size,
17691770
allocated_size
1770-
FROM pg_get_shmem_allocations() pg_get_shmem_allocations(name, off, size, allocated_size);
1771+
FROM pg_get_shmem_allocations() pg_get_shmem_allocations(name, segment, off, size, allocated_size);
17711772
pg_shmem_allocations_numa| SELECT name,
17721773
numa_node,
17731774
size
17741775
FROM pg_get_shmem_allocations_numa() pg_get_shmem_allocations_numa(name, numa_node, size);
1776+
pg_shmem_segments| SELECT id,
1777+
name,
1778+
size,
1779+
freeoffset,
1780+
mapping_size,
1781+
mapping_reserved_size
1782+
FROM pg_get_shmem_segments() pg_get_shmem_segments(id, name, size, freeoffset, mapping_size, mapping_reserved_size);
17751783
pg_stat_activity| SELECT s.datid,
17761784
d.datname,
17771785
s.pid,

0 commit comments

Comments
 (0)