Skip to content

Commit 8aca4f3

Browse files
committed
Collect nropen for each process to monitor if fd leaks
This patch collects and displays the current number of opened file descriptors for each process to monitor if fd leaks. As each thread has the same fds with its process, there is no need to collect each thread's fd numbers then. Considering users may set the nr_open limit to a very large number, we regard MAX_OPEN to be 10000 to avoid further performance degradation. Signed-off-by: Fei Li <[email protected]>
1 parent eb158ef commit 8aca4f3

File tree

9 files changed

+78
-3
lines changed

9 files changed

+78
-3
lines changed

deviate.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ calcdiff(struct tstat *devstat, const struct tstat *curstat,
455455
devstat->cpu.cgcpuweight = curstat->cpu.cgcpuweight;
456456
devstat->cpu.cgcpumax = curstat->cpu.cgcpumax;
457457
devstat->cpu.cgcpumaxr = curstat->cpu.cgcpumaxr;
458+
devstat->cpu.nropen = curstat->cpu.nropen;
458459

459460
if (curstat->cpu.wchan[0])
460461
strcpy(devstat->cpu.wchan, curstat->cpu.wchan);

json.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,7 @@ static void json_print_PRC(char *hp, struct sstat *ss, struct tstat *ps, int nac
10301030
"\"blkdelay\": %lld, "
10311031
"\"nvcsw\": %llu, "
10321032
"\"nivcsw\": %llu, "
1033+
"\"nropen\": %d, "
10331034
"\"sleepavg\": %d}",
10341035
ps->gen.pid,
10351036
ps->cpu.utime,
@@ -1043,6 +1044,7 @@ static void json_print_PRC(char *hp, struct sstat *ss, struct tstat *ps, int nac
10431044
ps->cpu.blkdelay*1000/hertz,
10441045
ps->cpu.nvcsw,
10451046
ps->cpu.nivcsw,
1047+
ps->cpu.nropen,
10461048
ps->cpu.sleepavg);
10471049
}
10481050

man/atop.1

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,11 @@ Time that the process has been finished. If the process is still running,
16611661
this field shows `active'.
16621662
.PP
16631663
.TP 9
1664+
.B NROPEN
1665+
Current number of opened file descriptors (fds) for each process, at least 0.
1666+
As each thread has the same fds with its process, this filed shows `-`.
1667+
.PP
1668+
.TP 9
16641669
.B ENVID
16651670
Virtual environment identified (OpenVZ only).
16661671
.PP

parseable.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ print_PRC(char *hp, struct sstat *ss, struct tstat *ps, int nact)
785785
for (i=0; i < nact; i++, ps++)
786786
{
787787
printf("%s %d %s %c %u %lld %lld %d %d %d %d %d %d %d %c "
788-
"%llu %s %llu %d %d %llu %llu\n",
788+
"%llu %s %llu %d %d %d %llu %llu\n",
789789
hp,
790790
ps->gen.pid,
791791
spaceformat(ps->gen.name, namout),
@@ -804,6 +804,7 @@ print_PRC(char *hp, struct sstat *ss, struct tstat *ps, int nact)
804804
ps->cpu.rundelay,
805805
spaceformat(ps->cpu.wchan, wchanout),
806806
ps->cpu.blkdelay,
807+
ps->cpu.nropen,
807808
cgroupv2max(ps->gen.isproc, ps->cpu.cgcpumax),
808809
cgroupv2max(ps->gen.isproc, ps->cpu.cgcpumaxr),
809810
ps->cpu.nvcsw,

photoproc.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ static int proccont(struct tstat *);
6363
static void proccmd(struct tstat *);
6464
static void procsmaps(struct tstat *);
6565
static void procwchan(struct tstat *);
66+
static void procfd(struct tstat *);
6667
static count_t procschedstat(struct tstat *);
6768
static int proccgroupv2(struct tstat *);
6869
static struct cgroupv2vals *
@@ -218,6 +219,8 @@ photoproc(struct tstat *tasklist, int maxtask)
218219
if (getwchan)
219220
procwchan(curtask);
220221

222+
procfd(curtask);
223+
221224
// read network stats from netatop
222225
netatop_gettask(curtask->gen.tgid, 'g', curtask);
223226

@@ -981,6 +984,38 @@ procschedstat(struct tstat *curtask)
981984
return curtask->cpu.rundelay;
982985
}
983986

987+
/*
988+
** get current number of opened file descriptors for process
989+
** to monitor if fd leaks.
990+
** Considering users may set the max number of open files to
991+
** a very large number, we regard MAX_OPEN to be 10000.
992+
*/
993+
#define MAX_OPEN 10000
994+
995+
static void
996+
procfd(struct tstat *curtask)
997+
{
998+
DIR *dirp;
999+
struct dirent *dentry;
1000+
int fd_num = 0;
1001+
1002+
if ( (dirp = opendir("fd")) )
1003+
{
1004+
while ( (dentry = readdir(dirp)) )
1005+
{
1006+
if ( isdigit(dentry->d_name[0]) )
1007+
fd_num++;
1008+
1009+
if ( fd_num >= MAX_OPEN )
1010+
break;
1011+
}
1012+
1013+
curtask->cpu.nropen = fd_num;
1014+
1015+
closedir(dirp);
1016+
}
1017+
}
1018+
9841019
/*
9851020
** CGROUP V2 specific items
9861021
*/

photoproc.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ struct tstat {
8282
int cgcpuweight; /* cgroup cpu.weight */
8383
int cgcpumax; /* cgroup cpu.max percentage */
8484
int cgcpumaxr; /* restrictive percentage */
85-
int ifuture[3]; /* reserved for future use */
85+
int nropen; /* number of opened files */
86+
int ifuture[2]; /* reserved for future use */
8687
char wchan[16]; /* wait channel string */
8788
count_t rundelay; /* schedstat rundelay (nanosec) */
8889
count_t blkdelay; /* blkio delay (ticks) */

showlinux.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ proc_printdef *allprocpdefs[]=
423423
&procprt_STTIME,
424424
&procprt_ENDATE,
425425
&procprt_ENTIME,
426+
&procprt_NROPEN,
426427
&procprt_THR,
427428
&procprt_TRUN,
428429
&procprt_TSLPI,
@@ -1300,7 +1301,7 @@ priphead(int curlist, int totlist, char *showtype, char *showorder,
13001301
"RUID:8 RGID:8 EUID:5 EGID:4 "
13011302
"SUID:3 SGID:2 FSUID:3 FSGID:2 "
13021303
"STDATE:7 STTIME:7 ENDATE:5 ENTIME:5 "
1303-
"ST:6 EXC:6 S:6 SORTITEM:10 CMD:10",
1304+
"NROPEN:5 ST:6 EXC:6 S:6 SORTITEM:10 CMD:10",
13041305
"built-in varprocs");
13051306

13061307
make_proc_prints(cmdprocs, MAXITEMS,

showlinux.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ extern proc_printdef procprt_STDATE;
418418
extern proc_printdef procprt_STTIME;
419419
extern proc_printdef procprt_ENDATE;
420420
extern proc_printdef procprt_ENTIME;
421+
extern proc_printdef procprt_NROPEN;
421422
extern proc_printdef procprt_THR;
422423
extern proc_printdef procprt_TRUN;
423424
extern proc_printdef procprt_TSLPI;

showprocs.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ char *procprt_ENDATE_a(struct tstat *, int, int);
115115
char *procprt_ENDATE_e(struct tstat *, int, int);
116116
char *procprt_ENTIME_a(struct tstat *, int, int);
117117
char *procprt_ENTIME_e(struct tstat *, int, int);
118+
char *procprt_NROPEN_a(struct tstat *, int, int);
119+
char *procprt_NROPEN_e(struct tstat *, int, int);
118120
char *procprt_THR_a(struct tstat *, int, int);
119121
char *procprt_THR_e(struct tstat *, int, int);
120122
char *procprt_TRUN_a(struct tstat *, int, int);
@@ -1235,6 +1237,32 @@ proc_printdef procprt_ENTIME =
12351237
{ " ENTIME ", "ENTIME", procprt_ENTIME_a, procprt_ENTIME_e, 8 };
12361238
/***************************************************************/
12371239
char *
1240+
procprt_NROPEN_a(struct tstat *curstat, int avgval, int nsecs)
1241+
{
1242+
static char buf[64];
1243+
1244+
if (curstat->gen.isproc)
1245+
sprintf(buf, "%*d", procprt_NROPEN.width, curstat->cpu.nropen);
1246+
else
1247+
sprintf(buf, "%*s", procprt_NROPEN.width, "-");
1248+
1249+
return buf;
1250+
}
1251+
1252+
char *
1253+
procprt_NROPEN_e(struct tstat *curstat, int avgval, int nsecs)
1254+
{
1255+
static char buf[64];
1256+
1257+
sprintf(buf, "%*s", procprt_NROPEN.width, "-");
1258+
1259+
return buf;
1260+
}
1261+
1262+
proc_printdef procprt_NROPEN =
1263+
{ " NROPEN", "NROPEN", procprt_NROPEN_a, procprt_NROPEN_e, 7 };
1264+
/***************************************************************/
1265+
char *
12381266
procprt_THR_a(struct tstat *curstat, int avgval, int nsecs)
12391267
{
12401268
static char buf[15];

0 commit comments

Comments
 (0)