ext4 파일이스템의 사용률 계산에 대한 문의

Q1)
EXT 파일시스템의 경우 단편화로 인한 성능 이슈로 기본적으로 5% Reserved Block을 가지고 가는데 Use% 계산에 영향을 미치는 것으로 보입니다.
df 로 출력 값 중 Use% 어떠한 계산식에 근거하여 산출되는지 알고 싶습니다.

Q2)
계산된 결과에서 반올림을 하나요?
예를 들어 계산식에 의해 25.57% 로 되었는데 소숫점 첫째자리 반올림을 해서 df Use% 정보가 26% 로 출력이 되는지요?

Q3)
XFS 파일시스템의 경우 기본적으로 Reserved Block 없이 파일시스템 생성이 되는것으로 알고 있습니다.
XFS 파일시스템은 데이터 단편화에 의한 성능 이슈가 없는지요? 아니면 EXT 파일시스템에 비해 상대적으로 덜한 것인지요?

 

1040         case SIZE_FIELD:
1041         case ITOTAL_FIELD:
1042           cell = xstrdup (df_readable (false, v->total, buf,
1043                                        v->input_units, v->output_units));
1044           break;
1045 
1046         case USED_FIELD:
1047         case IUSED_FIELD:
1048           cell = xstrdup (df_readable (v->negate_used, v->used, buf,
1049                                        v->input_units, v->output_units));
1050           break;
1051 
1052         case AVAIL_FIELD:
1053         case IAVAIL_FIELD:
1054           cell = xstrdup (df_readable (v->negate_available, v->available, buf,
1055                                        v->input_units, v->output_units));
1056           break;
1057 
1058         case PCENT_FIELD:
1059         case IPCENT_FIELD:
1060           {
1061             double pct = -1;
1062             if (! known_value (v->used) || ! known_value (v->available))
1063               ;
1064             else if (!v->negate_used
1065                      && v->used <= TYPE_MAXIMUM (uintmax_t) / 100
1066                      && v->used + v->available != 0
1067                      && (v->used + v->available < v->used)
1068                      == v->negate_available)
1069               {
1070                 uintmax_t u100 = v->used * 100;
1071                 uintmax_t nonroot_total = v->used + v->available;
1072                 pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
1073               }
1074             else
1075               {
1076                 /* The calculation cannot be done easily with integer
1077                    arithmetic.  Fall back on floating point.  This can suffer
1078                    from minor rounding errors, but doing it exactly requires
1079                    multiple precision arithmetic, and it's not worth the
1080                    aggravation.  */
1081                 double u = v->negate_used ? - (double) - v->used : v->used;
1082                 double a = v->negate_available
1083                            ? - (double) - v->available : v->available;
1084                 double nonroot_total = u + a;
1085                 if (nonroot_total)
1086                   {
1087                     long int lipct = pct = u * 100 / nonroot_total;
1088                     double ipct = lipct;
1089 
1090                     /* Like 'pct = ceil (dpct);', but avoid ceil so that
1091                        the math library needn't be linked.  */
1092                     if (ipct - 1 < pct && pct <= ipct + 1)
1093                       pct = ipct + (ipct < pct);
1094                   }
1095               }
1096 
1097             if (0 <= pct)
1098               {
1099                 if (asprintf (&cell, "%.0f%%", pct) == -1)
1100                   cell = NULL;
1101               }
1102             else
1103               cell = strdup ("-");
1104 
1105             if (!cell)
1106               xalloc_die ();
1107               
1108             break;
1109           }

 

-- https://lwn.net/Articles/546473/

ext4: introduce reserved space

Currently in ENOSPC condition when writing into unwritten space, or
punching a hole, we might need to split the extent and grow extent tree.
However since we can not allocate any new metadata blocks we'll have to
zero out unwritten part of extent or punched out part of extent, or in
the worst case return ENOSPC even though use actually does not allocate
any space.

 

Answer)

EXT3/4, XFS 파일시스템은 기본적으로 파일스세템내에 5%정도의 reserved 영역을 갖게 되며, 해당 영역은 일반적으로 시스템 데몬들이라든지 Root 권한의 프로세스 등이 파일시스템에 write을 하여야 하나, 공간이 없어서 write를 못함에 따라 crash가 되는 현상을 방지하기 위해서 일정한 사이즈의 pre-reserved 영역을 갖게 되고 해당 영역은 그런 용도에서 사용됩니다.

예를들어, logging 같은 부분이 disk가 가득참에 따라 로깅을 못하고 crash되는 것을 방지하게 됩니다.

$ man tune2fs

Reserving some number of filesystem blocks for use by privileged processes is done to avoid filesystem fragmentation, and to allow system daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. Normally, the default percentage of reserved blocks is 5%.

해당 값은 일반적으로 5%이며, 해당 값은 사용자가 수정은 가능하나 권장하는 방법은 아닙니다. 그리고 privileged user는 기본적으로 root를 의미하고 추가적으로 user를 부여할 수 있으나 적극 권장드리는 부분은 아닙니다.

> 계산된 결과에서 반올림을 하나요?
> 예를 들어 계산식에 의해 25.57% 로 되었는데 소숫점 첫째자리 반올림을 해서 df Use% 정보가 26% 로 출력이 되는지요?

소스를 확인한 결과, 그냥 올림을 하고 있습니다.

> df 로 출력 값 중 Use% 어떠한 계산식에 근거하여 산출되는지 알고 싶습니다.

Use%의 값은 used / (used + available) 의 값으로 보시면 됩니다.

예를들어, total : 100 / reserved blcok : 5 / used :30 (not used in reserved block) / available : 65
Use% = 30 * 100 / ( 30 + 65 ) = 32%

파일시스템 df - use% 계산 방식 및 단편화

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다