0

0

MySQL 调优基础(一) CPU与进程_MySQL

php中文网

php中文网

发布时间:2016-05-30 17:10:53

|

1437人浏览过

|

来源于php中文网

原创

一般而言,mysql 的调优可以分为两个层面,一个是在mysql层面上进行的调优,比如sql改写,索引的添加,mysql各种参数的配置;另一个层面是从操作系统的层面和硬件的层面来进行调优。操作系统的层面的调优,一般要先定位到是那种资源出现瓶颈——cpu、 内存、硬盘、网络,然后入手调优。所以其实mysql 的调优,其实不是那么简单,它要求我们对 硬件、os、mysql 三者都具有比较深入的理解。比如 numa 架构的cpu是如何分配cpu的,以及是如何分配内存的,如何避免导致swap的发生;linux 系统的io调度算法选择哪一种——cfq、deadline、noop、还是 anticipatory;mysql的redo log和undo log它们的写哪个是顺序写,哪个是随机写?

 

友邻phpB2B电子商务系统
友邻phpB2B电子商务系统

友邻phpB2B电子商务系统是一套用PHP开发的B2B电子商务系统应用程序,本系统基于PHP+MySQL开发, 采用优秀的MVC架构思想,同时本系统采用了流行的Smarty模板技术,静态模板与动态程序完全分离,系统自带十余个内容丰富的调用标签,同时可自由扩展各种插件或其他功能,秉承开源、开放的原则,是目前搭建B2B行业门户网站最好的程序。安装说明首先请确保目录attachment、data、con

下载

所以其实,如果想要对 MySQL 进行调优,要求我们必须对 硬件和OS,以及MySQL的内部实现原理,都要有很好的掌握。本文关于MySQL调优基础之 CPU和进程。

 

1. CPU 架构之 NUMA和SMP

 

SMP:称为共享内存访问CPU(Shared Memory Mulpti Processors), 也称为对称型CPU架构(Symmetry Multi Processors)

 

NUMA:非统一内存访问 (Non Uniform Memory Access)

 

它们最重要的区别在于内存是否绑定在各个物理CPU上,以及CPU如何访问内存:

 

SMP架构的CPU内部没有绑定内存,所有的CPU争用一个总线来访问所有共享的内存,优点是资源共享,而缺点是总线争用激烈。随着PC服务 器上的CPU数量变多(不仅仅是CPU核数),总线争用的弊端慢慢越来越明显,于是Intel在Nehalem CPU上推出了NUMA架构,而AMD也推出了基于相同架构的Opteron CPU。

 

NUMA 最大的特点是引入了node和distance的概念,node内部有多个CPU,以及绑定的内存。每个node的CPU和内存一般是相等。distance这个概念是用来定义各个node之间调用资源的开销。NUMA架构中内存和CPU的关系如下图所示:

MySQL 调优基础(一) CPU与进程_MySQL

 (node内部有多个CPU,node内部有内存;每两个node之间有 inter-connect)

 

NUMA架构的提出是为了适应多CPU,可以看到node内部的CPU对内存的访问分成了两种情况:

 

1)对node内部的内存的访问,一般称为 local access,显然访问速度是最快的;

 

2)对其它node中的内存的访问,一般称为 remote access,因为要通过 inter-connect,所以访问速度会慢一些;

 

因为CPU和内存是绑定而形成一个node,那么就涉及到CPU如何分配,内存如何分配的问题:

 

1)NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在某几个node之上,而physcpubind可以更加精细地规定运行在哪些核上。

2)NUMA的内存分配策略有localalloc、preferred、membind、interleave。localalloc规定进程从当前 node上请求分配内存;而preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的 node。membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。interleave规定进程从所有node上以RR算法交织地请求分配内存,达到随机均匀的从各个node中分配内存的目的。

 

NUMA 架构导致的问题——SWAP

 

因为NUMA架构的CPU,默认采用的是localalloc的内存分配策略,运行在本node内部CPU上的进程,会从本node内部的内存上分配内存,如果内存不足,则会导致swap的产生,严重影响性能!它不会向其它node申请内存。这是他最大的问题。

 

所以为了避免SWAP的产生,一定要将NUMA架构CPU的内存分配策略设置为:interleave; 这样设置的话,任何进程的内存分配,都会随机向各个node申请,虽然remote access会导致一点点的性能损失,但是他杜绝了SWAP导致的严重的性能损失。所以 interleave 其实是将NUMA架构的各个node中的内存,又重新虚拟成了一个共享的内存,但是和SMP不同的是,因为每两个node之间有 inter-connect ,所以又避免了SMP架构总线争用的缺陷。

 

2. CPU 和 Linux 进程

 

进程应该是Linux中最重要的一个概念。进程运行在CPU上,是所有硬件资源分配的对象。Linux中用一个task_struct的结构来描述进程,描述了进程的各种信息、属性、资源。

 

Linux中进程的生命周期和它们涉及的调用:

 

1)父进程调用fork() 产生一个新的自进程;

 

2)子进程调用exec() 指定自己要执行的代码;

 

3)子进程调用exit() 退出,进入zombie状态;

 

4)父进程调用wait(),等待子进程的返回,回收其所有资源;

 

Thread:

 

是一个执行单元,同一进程中所有线程,共享进程的资源。线程一般称为 LWP(Light Weight Process)轻量级进程。所以期限线程没有那么神秘,我们可以将其当做特殊的进程来看待。

 

进程的优先级和nice:

 

进程的调度,涉及到进程的优先级。优先级使用nice level来表示,其值范围:19 ~ -20。值越小,优先级越大,默认为0.

 

一般如果我们想降低某个线程被调度的频率,就可以调高它的nice值(越nice,就越不会去争用CPU)。

 

进程的 context switch:

 

进程上下文切换,是一个极为重要的概念,因为他对性能影响极大。进程的调度,级涉及到进程上下文的切换。上下文切换,是指将进程的所有的信息,从CPU的register中flush到内存中,然后换上其它进程的上下文。频繁的上下文切换,将极大的影响性能。

 

CPU中断处理:

 

CPU的中断处理是优先级最高的任务之一。中断分为:hard interrupte 和 soft interrupt.

 

因为中断发生,就会去运行中断处理程序,也就导致了context switch,所以过多的中断也会导致性能的下降。

 

进程的各种状态 state:

 

进程的各种状态,一定要搞清楚他们的含义,不然后面进程的 load average(top命令和uptime命令)等各种信息会看不懂。

 

1)TASK_RUNNING: In this state, a process is running on a CPU or waiting to run in the queue (run queue).

 

2)TASK_STOPPED: A process suspended by certain signals (for example SIGINT, SIGSTOP) is in this state. The process is waiting to be

 

     resumed by a signal such as SIGCONT.

 

3)TASK_INTERRUPTIBLE: In this state, the process is suspended and waits for a certain condition to be satisfied. If a process is in

 

     TASK_INTERRUPTIBLE state and it receives a signal to stop, the process state is changed and operation will be interrupted. A typical

 

     example of a TASK_INTERRUPTIBLE process is a process waiting for keyboard interrupt.

 

4)TASK_UNINTERRUPTIBLE: Similar to TASK_INTERRUPTIBLE. While a process in TASK_INTERRUPTIBLE state can be interrupted, 

 

     sending a signal does nothing to the process in TASK_UNINTERRUPTIBLE state. A typical example of a TASK_UNINTERRUPTIBLE

 

     process is a process waiting for disk I/O operation.

 

5)TASK_ZOMBIE: After a process exits with exit() system call, its parent should know of the termination. In TASK_ZOMBIE state, a

 

     process is waiting for its parent to be notified to release all the data structure.

 

除了 TASK_RUNNING 中的进程可能在运行之外,其它状态的进程都没有在运行。但是其实 TASK_UNINTERRUPTIBLE 比较特殊,它其实可以看做是在运行的,因为他是在等待磁盘操作完成,所以其实从系统的角度,而不是从进程的角度而言,其实系统是在为进程运行的。这也就是为什么 load average 中的数值,是包括了 TASK_RUNNING 和 TASK_UNINTERRUPTIBLE 两种状态的进程的平均值。

 

进程如何使用内存:

 

进程的运行,必须申请和使用内存,最重要的包括堆和栈:

MySQL 调优基础(一) CPU与进程_MySQL

进程使用的内存,可以用 pmap, ps 等待命令行来查看。在后面会有站么的内存调优文章介绍。

 

CPU 调度:

 

前面介绍了CPU的调度涉及到进程的优先级和nice level. Linux中进程的调度算法是 O(1)的,所以进程数量的多少不会影响进程调度的效率。

 

进程的调度涉及到两个优先级数组(优先级队列):active, expired 。CPU按照优先级调度 active 队列中的进程,队列中所有进程调度完成之后,交换active队列和expired队列,继续调度。

 

NUMA架构的CPU在调度时,一般不会垮node节点进行调度,除非一个node节点CPU超载了并且请求进行负载均衡。因为垮node节点CPU调度影响性能。

 

3. Linux 如何度量 CPU 

 

1)CPU utilization:最直观最重要的就是CPU的使用率。如果长期超过80%,则表明CPU遇到了瓶颈;

 

2)User time: 用户进程使用的CPU;该数值越高越好,表明越多的CPU用在了用户实际的工作上

 

3)System time: 内核使用的CPU,包括了硬中断、软中断使用的CPU;该数值越低越好,太高表明在网络和驱动层遇到瓶颈;

 

4)Waiting: CPU花在等待IO操作上的时间;该数值很高,表明IO子系统遇到瓶颈;

 

5)Idel time: CPU空闲的时间;

 

6)Load average: the average of the sum of TASK_RUNNING and TASK_UNINTERRUPTIBLE processes. If processes that request CPU time are blocked (which means that the CPU has no time to process them), the load average will increase. On the other hand, if each 

process gets immediate access to CPU time and there are no CPU cycles lost, the load will decrease.

 

7)Context Switch: 上下文切换;

 

如何检测CPU:

 

检测CPU使用情况最好的工具是 top 命令:

 

3.1 top 命令 查看CPU 信息

MySQL 调优基础(一) CPU与进程_MySQL

要调优,那么就必须读懂 很多 命令行工具的输出。上面的top命令包括了很多的信息:

 

第一行:

 

top - 14:35:55 up 25 min, 4 users,   load average: 0.10, 0.07, 0.14

 

分别表示的是:当前系统时间;up 25 min表示已经系统已经运行25分钟; 4 users:表示系统中有4个登录用户;

 

load average: 分别表示最近 1 分钟, 5 分钟, 15分钟 CPU的负载的平均值。

 

(load average: the average of the sum of TASK_RUNNING and TASK_UNINTERRUPTIBLE processes);

 

这一行最重要的就是 load average

 

第二行:

 

Tasks: 92 total,  1 running, 91 sleeping , 0 stopped, 0 zombie

 

分别表示系统中的进程数:总共92个进程, 1个在运行,91个在sleep,0个stopped, 0个僵尸;

 

第三行:

 

Cpu(s): 0.0%us,  1.7 %sy, 0.0%ni, 97.7%id, 0.0%wa, 0.3%hi, 0.3%si, 0.0%st

 

这一行提供了关于CPU使用率的最重要的信息,分别表示 users time, system time, nice time, idle time, wait time, hard interrupte time, soft interrupted time, steal time; 其中最终要的是:users time, system time, wait time ,idle time 等等。nice time 表示用于调准进程nice level所花的时间。

 

第四行:

 

Mem:  total, used ,free, buffers

 

提供的是关于内存的信息,因为Linux会尽量的来使用内存来进行缓存,所以这些信息没有多大的价值,free数值小,并不代表存在内存瓶颈;

 

第五行:

 

Swap: total, used, free ,cached

 

提供的是关于swap分区的使用情况,这些信息也没有太大的价值,因为Linux的使用内存的机制决定的。used值很大并不代表存在内存瓶颈;

 

剩下是关于每个进程使用的资源的情况,进程的各种信息,按照使用CPU的多少排序,每个字段的含义如下:

 

PID: 表示进程ID;USER: 表示运行进程的用户;PR:表示进程优先级;NI:表示进程nice值,默认为0;

 

VIRT:The  total  amount  of  virtual  memory  used by the task.  It includes all code, data and shared libraries plus pages that have been swapped out. 进程占用的虚拟内存大小,包括了swap out的内存page;

 

RES: Resident size (kb)。The non-swapped physical memory a task is using. 进程使用的常驻内存大小,没有包括swap out的内存;

 

SHR:Shared Mem size (kb)。The amount of shared memory used by a task.  It simply reflects memory that could be potentially shared

 

         with other processes. 其实应该就是使用 shmget() 系统调用分配的共享内存,可以在多个进程之间共享访问。

 

S: 表示进程处于哪种状态:R: Running; S: sleeping; T: stoped; D: interrupted; Z:zomobie;

 

%CPU: 进程占用的CPU;

 

%MEM:进程占用的内存;

 

%TIME+: 进程运行时间;

 

COMMAND: 进程运行命令;

 

读懂 top 等相关命令行的信息是进行调优的基础。其实这些命令行的输出的含义,在man top中都有是否详细的说明。只要耐心看手册就行了。

 

上面的 top 命令默认是以 进程为单位来显示的,我们也可以以线程为单位来显示: top -H

MySQL 调优基础(一) CPU与进程_MySQL

可以看到以线程为单位是,Tasks totol数量明显增加了,有92增加到了 134,因为 mysqld 是线程架构的,后台有多个后台线程。

 

如果仅仅想查看 CPU 的 load average,使用uptime命令就行了:

 

[root@localhost ~]# uptime

 15:26:59 up  1:15,  4 users,  load average: 0.00, 0.02, 0.00

 

3.2 vmstat 查看CPU 信息

MySQL 调优基础(一) CPU与进程_MySQL

上面各个字段的含义:

 

 

FIELD DESCRIPTION FOR VM MODE
   Procs
       r: The number of processes waiting for run time.
       b: The number of processes in uninterruptible sleep.
   Memory
       swpd: the amount of virtual memory used.
       free: the amount of idle memory.
       buff: the amount of memory used as buffers.
       cache: the amount of memory used as cache.
       inact: the amount of inactive memory. (-a option)
       active: the amount of active memory. (-a option)
   Swap
       si: Amount of memory swapped in from disk (/s).
       so: Amount of memory swapped to disk (/s).
   IO
       bi: Blocks received from a block device (blocks/s).
       bo: Blocks sent to a block device (blocks/s).
   System
       in: The number of interrupts per second, including the clock.
       cs: The number of context switches per second.
   CPU
       These are percentages of total CPU time.
       us: Time spent running non-kernel code. (user time, including nice time)
       sy: Time spent running kernel code. (system time)
       id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
       wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
       st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

 

和CPU相关的信息有 user time, system time, idle time, wait time, steal time;

 

另外提供了关于中断和上下文切换的信息。System 中的in,表示每秒的中断数,cs表示每秒的上下文切换数;

 

其它的字段是关于内存和磁盘的。

 

3.3 iostat 命令查看 CPU 信息

 

[root@localhost ~]# iostat
Linux 2.6.32-504.el6.i686 (localhost.localdomain)       09/30/2015      _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.27    0.02    4.74    0.28    0.00   94.69

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.01         0.08         0.00        536          0
sda               1.64        42.27         8.97     290966      61720
[root@localhost ~]# iostat -c
Linux 2.6.32-504.el6.i686 (localhost.localdomain)       09/30/2015      _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.26    0.02    4.72    0.27    0.00   94.72

 

 

提供了cpu的平均使用率。

 

3.4 ps 命令查看某个进程和某个线程的 CPU 信息

 

比如我想查看 mysqld 的相关信息:

[root@localhost ~]# pidof mysqld
2412
[root@localhost ~]# ps -mp 2412 -o THREAD,pmem,rss,vsz,tid,pid
USER     %CPU PRI SCNT WCHAN  USER SYSTEM %MEM   RSS    VSZ   TID   PID
mysql     6.7   -    - -         -      - 42.8 441212 752744    -  2412
mysql     6.5  19    - -         -      -    -     -      -  2412     -
mysql     0.0  19    - -         -      -    -     -      -  2414     -
mysql     0.0  19    - -         -      -    -     -      -  2415     -
mysql     0.0  19    - -         -      -    -     -      -  2416     -
mysql     0.0  19    - -         -      -    -     -      -  2417     -
mysql     0.0  19    - -         -      -    -     -      -  2418     -
mysql     0.0  19    - -         -      -    -     -      -  2419     -
mysql     0.0  19    - -         -      -    -     -      -  2420     -
mysql     0.0  19    - -         -      -    -     -      -  2421     -
mysql     0.0  19    - -         -      -    -     -      -  2422     -
mysql     0.0  19    - -         -      -    -     -      -  2423     -
mysql     0.0  19    - -         -      -    -     -      -  2425     -
mysql     0.0  19    - -         -      -    -     -      -  2426     -
mysql     0.0  19    - -         -      -    -     -      -  2427     -
mysql     0.0  19    - -         -      -    -     -      -  2428     -
mysql     0.0  19    - -         -      -    -     -      -  2429     -
mysql     0.0  19    - -         -      -    -     -      -  2430     -
mysql     0.0  19    - -         -      -    -     -      -  2431     -
mysql     0.0  19    - -         -      -    -     -      -  2432     -
mysql     0.0  19    - -         -      -    -     -      -  2433     -
mysql     0.0  19    - -         -      -    -     -      -  2434     -

 

 

先获得 mysqld 的基础PID 2412,

 

然后查看其线程的信息:ps -mp 2412-o THREAD,pmem,rss,vsz,tid,pid ( -p 指定进程PID, -o 指定输出格式,参见man ps)

 

第一列就是关于线程CPU的信息。另外我们也可以查出是占有的CPU很高的线程的tid。

 

关于ps我们一般使用 ps -elf , 如果想查看线程,可以 ps -elLf,其中的L表示 Leight weight process轻量级进程。

 

3.5 mpstat(multi processor stat) 命令查看多核CPU中每个CPU核心的信息

 

[root@localhost ~]# mpstat

Linux 2.6.32-504.el6.i686 (localhost.localdomain)       09/30/2015      _i686_  (1 CPU)

 

04:11:50 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle

04:11:50 PM  all    0.26    0.02    4.30    0.27    0.26    0.15    0.00    0.00   94.74

这里因为虚拟机中的单核CPU,所以只显示all,没有显示其它核心的CPU使用情况。

 

4. CPU 相关调优

 

1)使用上面介绍的工具:top, vmstat, iostat, ps -mp xxx -o, mpstat 等,可以确认是否存在 CPU 瓶颈。然后确认 user time, system time, wait time, context switch......那种占用比例高,确认是哪个进程占用CPU高。如果能确认是 mysqld 的相关进程,那么就可以从 mysql 上入手进行调优。比如使用mysql的命令 show processlist ;查看是哪个sql导致的,找到sql之后,进行优化或者重写等等,或者将其放到slave上去运行。

 

2)如果是 非必须的进程占用CPU,那么可以杀掉,然后使用cron让其在非高峰期去执行;或者使用 renice 命令降低其优先级;

 

[root@localhost ~]# renice -n -10 -p 2041

2041: old priority 10, new priority -10

将进程 2041 的优先级设置为 -10.

 

3)可以跟踪进程,查找原因:strace -aef -p spid -o file

 

[root@localhost ~]# strace -aef -p 2041 -o mysql.txt
Process 2041 attached - interrupt to quit
^CProcess 2041 detached
[root@localhost ~]# ll mysql.txt
-rw-r--r-- 1 root root 10091 Sep 30 16:44 mysql.txt
[root@localhost ~]# head mysql.txt
read(0, "\33", 1) = 1
read(0, "[", 1) = 1
read(0, "A", 1) = 1
write(1, "select version();", 17) = 17
read(0, "\n", 1) = 1
write(1, "\n", 1) = 1
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM CONT TSTP WINCH], [], 8) = 0
rt_sigaction(SIGINT, {0x8053ac0, [INT], SA_RESTART}, NULL, 8) = 0
rt_sigaction(SIGTSTP, {SIG_DFL, [], 0}, NULL, 8) = 0

 

4)换更好的CPU。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

2

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

1

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

3

2026.02.24

Golang 疑难杂症解决指南:常见问题排查与优化
Golang 疑难杂症解决指南:常见问题排查与优化

《Golang 疑难杂症解决指南》聚焦开发过程中常见却棘手的问题,从并发模型、内存管理、性能瓶颈到工程化实践逐步拆解。通过真实案例与调试思路,帮助开发者定位问题根因,建立系统化排查方法。不只给出答案,更强调分析路径与工具使用,让你在复杂 Go 项目中具备持续解决问题的能力。

1

2026.02.24

Golang 入门学习路线:从零基础到上手开发
Golang 入门学习路线:从零基础到上手开发

Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。

0

2026.02.24

中国研究生招生信息网官方网站入口 研招网网页版在线入口
中国研究生招生信息网官方网站入口 研招网网页版在线入口

中国研究生招生信息网入口(https://yz.chsi.com.cn) 此网站是研究生报名入口的唯一官方网站

95

2026.02.24

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

14

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

15

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Node.js 教程
Node.js 教程

共57课时 | 12万人学习

CSS3 教程
CSS3 教程

共18课时 | 6.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号