大连零基础网站建设教学在哪里男朋友说是做竞彩网站维护的

当前位置: 首页 > news >正文

大连零基础网站建设教学在哪里,男朋友说是做竞彩网站维护的,哪个建站软件比较好带论坛,湖北在线网站建设目录 一、/proc/[PID]/下的各个文件1、proc简介2、/proc/[PID]/详解 二、通过Linux API获取当前进程或线程的资源使用情况1、getrusage2、sysinfo3、times 在工作中#xff0c;我们排除app出现的一些性能/资源问题时#xff0c;通常要先知道当前app的资源使用情况#xff0c… 目录 一、/proc/[PID]/下的各个文件1、proc简介2、/proc/[PID]/详解 二、通过Linux API获取当前进程或线程的资源使用情况1、getrusage2、sysinfo3、times 在工作中我们排除app出现的一些性能/资源问题时通常要先知道当前app的资源使用情况方能进一步思考改进措施。获取这些信息的途径有很多我这里简单分享下两种1从proc文件系统2通过Linux 的API函数。 一、/proc/[PID]/下的各个文件 1、proc简介 /proc 目录是一个特殊的虚拟文件系统它提供了对内核运行时信息的访问包括进程、设备、网络、文件系统等各个方面的信息。它不是一个真正的文件系统而是基于内核数据结构的一个接口通过这个接口可以获取系统的运行时状态。 下面是 /proc 目录的一些重要子目录和关键内容的说明 /proc/[PID]此目录以进程的 IDPID命名并包含与该进程有关的文件和目录如之前所讲的 /proc/pid/目录。 /proc/cpuinfo该文件包含有关 CPU处理器的信息如厂商、型号、频率、缓存等。 /proc/meminfo该文件包含有关系统内存的信息如总内存、可用内存、缓存、交换分区等。 /proc/mounts此文件列出了系统上已挂载的文件系统包括文件系统类型、挂载点、挂载选项等信息。 /proc/net此目录包含有关网络协议、接口和连接的信息如 /proc/net/tcp、/proc/net/udp 等文件。 /proc/sys此目录包含与内核参数和系统配置相关的文件。可以通过读写这些文件来修改内核的运行时行为。 /proc/version该文件包含了当前正在运行的内核版本信息。 /proc/cmdline此文件包含了系统引导时传递给内核的命令行参数。 /proc/uptime该文件包含自系统开机以来的运行时间和空闲时间。 /proc/sys/kernel/hostname此文件包含主机的名称hostname。 除了上述目录和文件/proc 目录下还有很多其他文件和目录涵盖了系统和进程的各个方面的信息。 需要注意的是/proc 目录下的文件是动态生成的信息在进程运行时改变。读取这些文件时请确保有足够的权限并理解每个文件的含义和用途。此外不要轻易对 /proc 目录下的文件进行修改因为这可能会导致系统不稳定或损坏。 2、/proc/[PID]/详解 arch_status: 该文件包含了有关进程所运行的指令集架构的信息。例如它可以显示进程在x86或ARM架构上运行。 attr: 此目录包含与进程关联的文件、目录和进程的访问控制列表ACL信息。这些文件和目录的访问权限可以在这里进行管理和修改。 autogroup: 这个文件显示了进程是否被自动控制分组以限制对CPU资源的访问。如果进程分配给自动控制分组则该文件中的值为1否则为0。 auxv: 此文件包含了进程的辅助向量信息这些信息在加载动态链接器时向其传递参数。辅助向量为动态链接器提供有关进程环境和运行状态的信息。 cgroup: 该文件显示了进程所属的控制组cgroup的路径。控制组是一种组织和限制进程资源使用的方式。 cmdline: 该文件包含了启动进程时使用的命令行参数以null字符分隔各个参数。可以通过读取该文件来获取进程的命令行参数信息。 comm: 进程的命令名可以通过这个文件获得。它可以是可执行文件名或进程自描述。 coredump_filter:这个文件决定了进程在发生崩溃时生成核心转储core dump的内容。通过修改该文件的值可以控制生成核心转储时包含的内容这对于调试崩溃问题非常有用。可以使用 echo 命令将特定的值写入这个文件中以修改核心转储的行为。 cpu_resctrl_groups:这个文件是与 CPU 资源控制Resource Control相关的用于管理进程对CPU资源的使用。通过这个文件可以查询或配置进程关联的 CPU ResCtrlCPU资源控制组的信息。CPU资源控制是用于管理和限制进程对CPU资源的访问的一种技术可以实现资源隔离、分配和监控。 cwd: 这是一个符号链接指向进程的当前工作目录current working directory。 environ: 该文件包含了进程的环境变量以null字符分隔各个环境变量。通过读取该文件可以获取进程的环境变量信息。 cpuset: 这个文件包含了进程所属的 cpusetCPU affinity的信息可以用于管理进程所能使用的 CPU 核心。 通过这个文件可以查询或设置进程所在的 cpuset。 exe:这是一个符号链接指向进程正在执行的可执行文件。通过读取这个符号链接可以获取进程当前正在执行的可执行文件的路径。 fdinfo: 这个目录包含了关于进程打开的文件描述符file descriptor的详细信息如文件的偏移量offset等。 gid_map:这个文件用于表示进程的实际组IDGID与其用户命名空间中的GID之间的映射关系。 io:这个文件包含了有关进程的输入/输出统计信息如读取和写入的字节数、I/O操作次数等。 limits:这个文件包含了对进程资源限制的报告显示了一些限制项目的值比如内存限制、文件大小限制等。 loginuid:这个文件记录了与进程关联的登录用户IDlogin UID。 map_files:这个目录包含了进程打开的映射文件的相关信息可以用于查询进程当前使用的文件映射情况。 fd: 此目录包含了进程打开的文件描述符file descriptor的符号链接。可以通过查看这些符号链接来获取进程打开的文件等信息。 maps: 该文件包含有关进程内存映射的信息包括进程的内存地址范围、映射的文件等。 mounts: 此文件显示了进程的挂载点信息包括进程当前挂载的各个文件系统的详细数据。 mem:这个文件允许对进程的内存空间进行直接访问可以用于调试、内存分析等目的。 mountinfo:这个文件提供了有关进程所挂载的文件系统的详细信息包括挂载点、挂载选项等。 mountstats: 此文件包含了有关挂载点的统计信息如 I/O 统计等。 net:目录包含了一系列与网络相关的文件和子目录可以用于查询进程的网络连接、端口等信息。 ns:这个目录包含了进程的各种命名空间相关的符号链接可以用于查询和操作进程的命名空间。 numa_maps:这个文件包含了有关进程内存使用和NUMA节点分布情况的信息对于了解进程的NUMA相关性非常有用。 oom_adj:这个文件包含了与进程的OOMOut Of Memory分级相关的信息用于调整进程在内存不足情况下被系统杀死的优先级。 oom_score:这个文件包含了进程的OOM分数用于在系统内存不足时选择性地终止进程。 oom_score_adj:与 oom_adj 类似这个文件也用于调整进程在内存不足情况下被系统杀死的优先级。 pagemap:这个文件提供了有关进程虚拟内存页面到物理内存帧的映射信息对于内存管理方面的深入了解非常有用。 patch_state:这个文件包含了有关进程的内核安全补丁状态的信息通常用于安全审计和补丁管理。 personality: 这个文件包含了与进程的运行环境和虚拟机架构相关的信息用于指定进程的特定行为。 projid_map:在用户命名空间中使用的文件用于表示进程实际项目IDProject ID与其用户命名空间中的项目ID之间的映射关系。 root:这是一个符号链接指向进程的根目录。 sched:这个文件提供了与进程调度策略和优先级相关的信息包括当前调度策略、优先级等。 schedstat:这个文件包含了与进程调度统计相关的信息如运行时间、等待时间等。 sessionid:这个文件记录了与进程关联的会话ID。 setgroups:这个文件包含了与进程的附加组supplementary group相关的信息。 smaps:这个文件提供了详细的进程内存映射信息包括每个内存区域的权限、大小、映射文件等。 smaps_rollup: 类似于 smaps 文件但提供了按文件和库合并的内存映射信息用于更简洁的内存分析。 stack:这个文件记录了进程的当前栈的内容。 stat: 这个文件提供了与进程状态相关的信息如进程ID、父进程ID、运行状态等。 statm:这个文件提供了与进程内存使用量相关的信息包括进程的总内存、共享内存、库内存、堆内存等。 status:这个文件提供了有关进程的多种信息包括进程状态、内存使用、文件描述符等。 syscall:这个目录包含与进程相关的系统调用信息可以用于跟踪和分析进程的系统调用。 task:这个目录包含了进程的所有线程task的信息。 timens_offsets:这个文件提供了与进程关联的时间命名空间偏移量的信息用于跟踪进程的时间命名空间变化。 timers:这个目录包含了与进程相关的定时器的信息如定时器ID、时间值等。 timerslack_ns:这个文件包含了与进程的定时器松弛值timerslack有关的信息用于调整进程的定时行为。 uid_map:这个文件用于表示进程的实际用户IDUID与其用户命名空间中的UID之间的映射关系。 wchan:是一个用于描绘一个进程在等待什么的内核函数指针。它表示了进程当前正在等待的内核函数或系统调用。可用于调试和分析进程的等待状态。 这些文件和目录提供了关于特定进程的多种信息如进程状态、资源使用情况、环境变量等通常被用于性能调优、调试以及资源管理方面对于普通用户来说可能并不经常需要直接操作这些文件。通过读取这些文件可以了解并监视系统中各个进程的情况。请注意有些文件是符号链接需要使用readlink或ls -l等命令来获取其指向的真实路径。 知识补充    命名空间Namespace在Linux系统中是一种用于隔离系统资源的机制。它允许在同一台物理机上创建多个隔离的环境每个环境可以拥有自己独立的资源实例例如进程ID、挂载点、网络、用户等。这种隔离使得不同的进程能够在同一系统上运行而彼此之间互不干扰。 在Linux中有多种类型的命名空间包括但不限于以下几种 PID 命名空间PID Namespace使得进程拥有自己独立的进程ID空间进程在不同的PID命名空间中可以拥有相同的PID而不会相互影响。 挂载命名空间Mount Namespace使得进程拥有独立的文件系统挂载点不同的挂载命名空间中可以有不同的文件系统视图。 网络命名空间Network Namespace允许每个命名空间中拥有独立的网络设备、IP地址等网络资源实现网络隔离。 IPC 命名空间IPC Namespace用于隔离进程间通信资源如消息队列和共享内存等。 UTS 命名空间UTS Namespace用于隔离系统标识如主机名等。 用户命名空间User Namespace允许分配不同的用户和组ID给进程从而实现用户隔离。 通过使用命名空间容器技术得以实现并且不同的容器可以在相互隔离的环境中运行从而实现更高效的资源利用和更好的安全性。 二、通过Linux API获取当前进程或线程的资源使用情况 要获取当前进程或线程的资源使用情况可以使用Linux提供的一些系统调用或API。以下是一些常用的方法 1、getrusage getrusage 是一个用于获取进程或线程的资源使用情况的系统调用函数在 Linux 系统中的头文件 sys/resource.h 中定义。 #include sys/time.h #include sys/resource.hint getrusage(int who, struct rusage usage);参数who用于指定获取资源使用情况的对象包括以下两个选项 RUSAGE_SELF: 获取当前进程的资源使用情况。RUSAGE_CHILDREN: 获取当前进程创建的所有子进程的资源使用情况的汇总信息。 参数 usage 是一个指向 struct rusage 结构体的指针用于存储获取到的资源使用情况信息。 //struct rusage 结构体包含了一系列字段用于表示不同类型的资源使用情况 struct rusage {struct timeval ru_utime; / user CPU time used /struct timeval ru_stime; / system CPU time used /long ru_maxrss; / maximum resident set size /long ru_ixrss; / integral shared memory size /long ru_idrss; / integral unshared data size /long ru_isrss; / integral unshared stack size /long ru_minflt; / page reclaims (soft page faults) /long ru_majflt; / page faults (hard page faults) /long ru_nswap; / swaps /long ru_inblock; / block input operations /long ru_oublock; / block output operations /long ru_msgsnd; / IPC messages sent /long ru_msgrcv; / IPC messages received /long ru_nsignals; / signals received /long ru_nvcsw; / voluntary context switches /long ru_nivcsw; / involuntary context switches */ };ru_utime用户级别的 CPU 时间执行用户程序的时间。ru_stime系统级别的 CPU 时间执行系统调用的时间。ru_maxrss进程最大的常驻内存大小以 KB 为单位。ru_ixrss进程的共享内存大小。ru_idrss进程的非共享数据段的大小。ru_isrss进程的栈大小。ru_minflt产生的次缺页错误对不存在的内存页面发生的访问需要从硬盘加载。ru_majflt产生的主缺页错误必须从硬盘加载数据。ru_nswap发生的交换次数从内存到磁盘或反之。ru_inblock从块设备读取的次数。ru_oublock向块设备写入的次数。ru_msgsnd发送的消息数。ru_msgrcv接收的消息数。ru_nsignals发出的信号数。ru_nvcsw从等待状态唤醒的上下文切换次数通过虚拟终端 I/O、文件系统路径名查找、等待 CPU 时间等方式。ru_nivcsw无法满足进程需求而导致的上下文切换次数。 这些资源使用情况信息对于进程性能分析和系统监控非常有用。getrusage 函数返回的资源使用情况是关于当前进程或线程的信息。要获取其他进程的资源使用情况需要使用相应的进程相关的系统调用如 wait4并将返回的 rusage 结构体作为参数传递给 wait4。 wait4 是一个用于等待子进程结束并获取其状态信息的系统调用函数。在 Linux 系统中的头文件 sys/wait.h 中定义。wait4 函数的原型为 pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);其中参数含义如下 pid指定要等待的子进程的 ID。传入 -1 表示等待任意子进程结束。status用于获取子进程的退出状态信息。options用于指定等待的选项包括一些控制子进程状态获取行为的选项。rusage用于获取子进程的资源使用情况信息即上一条回答中提到的 struct rusage 结构体。 wait4 函数会阻塞父进程直到指定的子进程结束。当子进程结束后父进程将获得子进程的退出状态信息存储在 status 中并且如果传入了 rusage 参数则会获取子进程的资源使用情况信息。 通常情况下wait4 函数与 fork 函数结合使用父进程通过 fork 创建子进程然后通过 wait4 等待子进程结束并获取其状态信息。这样可以实现父子进程之间的同步和协作。 #include sys/resource.hint main() {struct rusage usage;getrusage(RUSAGE_SELF, usage);// 打印CPU时间printf(CPU时间: %ld.%06ld 秒\n, usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);// 打印最大使用的内存printf(最大内存使用量: %ld 字节\n, usage.ru_maxrss);// 其他资源使用情况可以在usage结构体中查看// …return 0; }2、sysinfo sysinfo 是一个用于获取系统信息的系统调用函数在 Linux 系统中的头文件 sys/sysinfo.h 中定义。函数原型如下 int sysinfo(struct sysinfo info);参数 info 是一个指向 struct sysinfo 结构体的指针用于存储获取到的系统信息。 //Since Linux 2.3.23 (i386) and Linux 2.3.48 (all architectures) the structure is: struct sysinfo {long uptime; / Seconds since boot /unsigned long loads[3]; / 1, 5, and 15 minute load averages /unsigned long totalram; / Total usable main memory size /unsigned long freeram; / Available memory size /unsigned long sharedram; / Amount of shared memory /unsigned long bufferram; / Memory used by buffers /unsigned long totalswap; / Total swap space size /unsigned long freeswap; / Swap space still available /unsigned short procs; / Number of current processes /unsigned long totalhigh; / Total high memory size /unsigned long freehigh; / Available high memory size /unsigned int mem_unit; / Memory unit size in bytes */char _f[20-2sizeof(long)-sizeof(int)]; / Padding to 64 bytes */ };long uptime系统已经运行的时间以秒为单位。unsigned long loads[3]系统的平均负载值分别代表过去1分钟、5分钟和15分钟的平均负载。这些值是无符号长整型数表示了负载值乘以 2^16 的结果。unsigned long totalram系统总共的物理内存大小以字节为单位。unsigned long freeram系统可用的物理内存大小以字节为单位。unsigned long sharedram被共享的物理内存大小以字节为单位。unsigned long bufferram被用作缓冲区的物理内存大小以字节为单位。unsigned long totalswap交换空间的总大小以字节为单位。unsigned long freeswap可用的交换空间大小以字节为单位。unsigned short procs当前进程数量。unsigned long totalhigh可用的高位内存大小以字节为单位。unsigned long freehigh空闲的高位内存大小以字节为单位。unsigned int mem_unit内存单元大小以字节为单位。 sysinfo 函数的返回值为 0 表示成功-1 表示失败并且可以通过 errno 来获取具体错误信息。 #include sys/sysinfo.h #include stdio.hint main(int argc, char *argv[]) {struct sysinfo info;sysinfo(info);// 打印总内存大小printf(总内存大小: %ld 字节\n, info.totalram * info.mem_unit);// 打印已使用内存大小printf(已使用内存大小: %ld 字节\n, (info.totalram - info.freeram) * info.mem_unit);// 其他资源使用情况可以在info结构体中查看// …return 0; }在struct sysinfo 结构体中loads 数组中的数值表示了负载值乘以 2^16 的结果这是因为 sysinfo 结构体中的 loads 数组使用了 unsigned long 类型。 在 Linux 内核中负载值是以固定点数的格式表示的使用了定点数表示方式来保留小数部分。在这里每个负载值都被乘以了 2^1665536以便将小数部分转换为整数。 这种表示方式的好处在于它可以比较精确地表示系统的负载情况同时又不需要使用浮点数来表示因为浮点数的运算会耗费相对更多的 CPU 时间。通过将负载值乘以一个固定的倍数2^16可以在不牺牲太多精度的情况下使用整数进行表示和计算这样会更高效。 当我们从 struct sysinfo 结构体中获取负载值时需要将其除以 2^16 来得到真实的负载值。例如在上面的示例代码中打印负载值时并没有除以 2^16因此实际的负载值应当是 info.loads[x] / 65536 才能得到系统的实际负载情况。 总之通过将负载值乘以 2^16 来表示Linux 内核可以在保持较高精度的同时使用更高效的整数表示方式用于存储和计算系统的负载情况。 3、times times 函数是一个用于获取进程和子进程的系统和用户 CPU 时间的系统调用其原型如下 #include sys/times.hclock_t times(struct tms *buf);buf 是一个指向 tms 结构的指针它用来存储 CPU 时间的信息。 struct tms 结构包含了进程和子进程的 CPU 时间信息其定义如下 struct tms {clock_t tms_utime; // 进程在用户态花费的时间clock_t tms_stime; // 进程在内核态花费的时间clock_t tms_cutime; // 所有已终止子进程在用户态花费的时间clock_t tms_cstime; // 所有已终止子进程在内核态花费的时间 };tms_utime 表示进程在用户态花费的 CPU 时间。tms_stime 表示进程在内核态花费的 CPU 时间。tms_cutime 表示所有已终止子进程在用户态花费的 CPU 时间。tms_cstime 表示所有已终止子进程在内核态花费的 CPU 时间。 示例代码如下所示演示了如何使用 times 函数来获取进程的 CPU 时间信息 #include stdio.h #include sys/times.h #include time.h #include unistd.hint main() {struct tms tms_buf;clock_t start, end;// 获取起始时间start times(tms_buf);printf(Starting time: %ld\n, start);// 模拟一些工作for (int i 0; i 100000000; i) {// do something}// 获取结束时间end times(tms_buf);printf(Ending time: %ld\n, end);// 计算 CPU 时间消耗clock_t user_time tms_buf.tms_utime;clock_t sys_time tms_buf.tms_stime;printf(User CPU time: %ld\n, user_time);printf(System CPU time: %ld\n, sys_time);return 0; }这个示例代码中我们首先调用 times 函数获取了进程的 CPU 时间信息并输出了起始时间。然后进行了一些模拟工作之后再次调用 times 函数获取了结束时间最后计算了用户态和内核态的 CPU 时间消耗。