64-bit kernel
内核是否编译成64位
Cross-compiler tool prefix
交叉编译器工具前缀。如果你不是做交叉编译就直接按下回车。如果你正在交叉编译,对ARM系统输入像"arm-unknown-linux-gnu-",对64位PC输入像"x86_64-pc-linux-gnu-"的字样。对其他处理器而言还有许多其他可能的命令,但是这个表太大了。一旦一名开发者知道他们想要支持的处理器,很容易就可研究出处理器需要的命令。
注意:交叉编译是为别的处理器编译代码。比如,一台Intel系统正编译着不在Intel处理器上运行的程序,比如,这个系统可能正在编译着要在ARM或AMD处理器上运行的代码。
Compile also drivers which will not load
一些驱动可能在其它的编译平台被编译,而这个编译平台跟它的期望运行平台不一样(这不就是交叉编译么),所以即使这些驱动不能在编译平台加载运行,一些开发者仍然可能想要构建这个驱动来进行编译测试(就是看看它到底能不能编译通过,没打算让它运行么)。
所以,根据需求来选择,这个一般是不选的。
Local version - append to kernel release
本地版本号,附加到内核版本号后面。这使开发人员可以给定一个特殊版本号或命名他们自定义的内核。
Automatically append version information to the version string
是否自动添加版本信息到版本号后。如果本地有一个git版本库,git的修订号会被添加到版本号后面。
Kernel compression mode
使用哪一种格式压缩内核。开发人员可以从五个选项中选择一个。Gzip是默认值。
每种压缩格式和其他压缩格式相比都有更高或者更低的压缩比。更好的压缩比意味着更小的体积,但是与低压缩比文件相比,它解压时需要更多的时间。
Default hostname
默认主机名。这里可以配置主机名。通常地,开发者这行留空,以便以后Linux用户可以自己设置他们的主机名。
Support for paging of anonymous memory (swap)
启用或者禁用交换分区。Linux使用一个叫做“swap space”的独立分区来使用虚拟内存。这相当于Windows中的页面文件。
典型地,开发者在这行回答“Y”。
System V IPC
内核是否支持IPC。进程间通信使进程间可以通信和同步。最好启用IPC不然许多程序将无法工作。这个问题回答“Y”。
POSIX Message Queues
是否使用POSIX消息队列。这个问题只会在IPC启用后看见。POSIX消息队列是一种给每条消息一个优先级的消息队列(一种进程间通信形式)。默认的选择是“Y”。
Auditing support
是否支持审计。审计支持会记录所有文件的访问和修改。
内核IRQ子系统。中断请求(IRQ)是硬件发给处理器的一个信号,它暂时停止一个正在运行的程序并允许一个特殊的程序占用CPU运行。
IRQ subsystem
IRQ(中断请求)子系统
Expose hardware/virtual IRQ mapping via debugfs
通过debugfs来显示硬件/虚拟的IRQ映射。它询问是否可以使用虚拟的调试文件系统来映射硬件及Linux上对应的IRQ中断号。
这个用作调试目的,大多数用户不需要用到,所以选择“no”。
Timers subsystem
Linux内核时钟子系统
Timer tick handling
内核时钟滴答处理程序
Periodic timer ticks (constant rate, no dynticks)
无论CPU是否需要,都强制按照固定频率不断触发时钟中断。这是最耗电的方式,不推荐使用。
Idle dynticks system (tickless idle)
CPU在空闲状态时不产生不必要的时钟中断,以使处理器能够在较低能耗状态下运行以节约电力。适合于大多数场合。
Full dynticks system (tickless)
完全无滴嗒。即使CPU在忙碌状态也尽可能关闭所有时钟中断,适用于CPU在同一时间仅运行一个任务,或者用户空间程序极少与内核交互的场合。即使开启此选项,也需要额外设置“nohz_full=?”内核命令行参数才能真正生效。
Full dynticks system on all CPUs by default
即使没有设置“nohz_full”引导参数,也默认对所有CPU(boot CPU 除外)开启完全无滴答特性。
Old Idle dynticks config
等价于CONFIG_NO_HZ_IDLE,临时用来兼容老版本内核选项,未来会被删除。
High Resolution Timer Support
高精度定时器(hrtimer),是从2.6.16开始引入,用于取代传统timer wheel(基于jiffies定时器)的时钟子系统。可以降低与内核其他模块的耦合性,还可以提供比1毫秒更高的精度(因为它可以读取HPET/TSC等新型硬件时钟源),可以更好的支持音视频等对时间精度要求较高的应用。建议选“Y”。
并不是所有的硬件支持这个,通常地说,如果硬件很慢或很旧,那么选择“no”,否则选择“yes”。
[提示]这里说的“定时器”是指“软件定时器”,而不是主板或CPU上集成的硬件时钟发生器(ACPI PM Timer/HPET Timer/TSC Timer)。
CPU/Task time and stats accounting
CPU/进程的时间及状态统计,这个是关于进程的追踪。
Cputime accounting
CPU用时统计。
Simple tick based cputime accounting (TICK_CPU_ACCOUNTING) (简单的基于滴答的统计,适用于大多数场合)
Deterministic task and CPU time accounting (VIRT_CPU_ACCOUNTING_NATIVE) (通过读取CPU计数器进行统计,可以提供更精确的统计,但是对性能有一些不利影响)
Full dynticks CPU time accounting (VIRT_CPU_ACCOUNTING_GEN) (利用上下文跟踪子系统,通过观察每一个内核与用户空间的边界进行统计。该选项对性能有显著的不良影响,目前仅用于完全无滴答子系统)
Fine granularity task level IRQ time accounting (IRQ_TIME_ACCOUNTING) (通过读取TSC时间戳进行统计,这是统计进程IRQ时间的更细粒度的统计方式,但对性能有些不良影响(特别是在RDTSC指令速度较慢的CPU上))
TICK_CPU_ACCOUNTING会在每个CPU滴答中检测/proc/stat。这是默认的选项,这个记账方法非常简单。我选择了这个。
注意:CPU滴答是抽象测量CPU时间的方式。每个处理器、操作系统和安装的系统都不同,比如说,一个更强大的处理器会比老的处理器拥有更多的CPU滴答。如果你安装了一个Linux系统,然后接着在同一块磁盘上重新安装了它,你可能会得到一个更快或更慢的CPU滴答时间(至少一些计算机技术书上这么说)。通常来讲,一个更快的时钟速度意味着更多的CPU滴答。
如果启用了VIRT_CPU_ACCOUNTING_GEN,任务和CPU时间统计将由监视内核-用户边界实现。这个选择的代价是会增加额外的开销。
IRQ_TIME_ACCOUNTING记账方式则通过检测IRQ状态间的时间戳工作,这个性能开销很小。
BSD Process Accounting
BSD进程记账。用户空间程序可以要求内核将进程的统计信息写入一个指定的文件,主要包括进程的创建时间/创建者/内存占用等信息。为了得到一个更小和更快的内核,我选择了“no”。
BSD Process Accounting version 3 file format
使用新的v3版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式。比如 GNU Accounting Utilities 这样的工具可以识别v3格式。
Export task/process statistics through netlink (TASKSTATS)
通过netlink接口向用户空间导出进程的统计信息,与 BSD Process Accounting 的不同之处在于这些统计信息在整个进程生存期都是可用的。TASK_STATS使内核可以通过网络套接字导出进程统计。网络套接字是内核和用户空间进程间IPC通信的一种形式。
Enable per-task delay accounting (TASK_DELAY_ACCT)
在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间。TASK_DELAY_ACCT监视进程并注意资源访问的延迟。比如,TASK_DELAY_ACCT可以看到X进程正在为了CPU时间而等待,如果TASK_DELAY_ACCT观察到进程已经等待了太长时间,这个进程接着就会被给予一些CPU时间。
Enable extended accounting over taskstats (TASK_XACCT)
在统计信息中包含进程的更多扩展信息。TASK_XACCT会收集额外的统计数据,为了更小的内核负载我会禁用这个。
Enable per-task storage I/O accounting
在统计信息中包含进程在存储设备上的I/O字节数。
RCU Subsystem
RCU(Read-Copy Update)子系统。在读多写少的情况下,这是一个高性能的锁机制,对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它(速度非常快),但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据,速度非常慢。RCU只适用于读多写少的情况:如网络路由表的查询更新,设备状态表的维护,数据结构的延迟释放以及多径I/O设备的维护等。
读取-复制-更新子系统是一种低负载的同步机制,它允许程序查看到正在被修改/更新的文件。
Kernel .config support
内核的.config支持。开发人员可以选择保存由这个配置工具生成的设置到一个文件中。这个文件可以放在内核中,也可在一个模块中,或者完全不保存。这个文件可以被想要编译一个完全跟某人相同内核的开发者使用。这个文件还可以帮助开发人员使用一个更新的编译器重新编译一个内核。举例来说,开发人员配置并编译了一个内核,然而编译器有一些bug,但开发人员仍然需要一个使用这些设置的内核。而值得庆幸的是,开发人员可以升级他们的编译器,并使用设置文件来节省他们重新配置内核的时间。开发人员也可以在另一台计算机上保存源代码和配置文件并编译内核。至于另一个目的,开发人员可以加载该文件,并根据需要调整设置。我选择保存配置文件在一个模块中,
Enable access to .config through /proc/config.gz
启用通过/proc/config.gz来访问.config的功能。是询问这个文件是否是可以通过这次方式访问的,我选择了“yes”。
Kernel log buffer size (16 => 64KB, 17 => 128KB)
内核日志缓冲区大小。小的缓冲区意味着它无法像更大的缓冲区那样保持日志更长的时间。这个选择取决于开发者想要日志保持的时间,我选择的是“12”。
Memory placement aware NUMA scheduler
由NUMA调度器进行内存分配,这是一个NUMA调度器,回答“yes”。
允许自动根据NUMA系统的节点分布状况进行进程/内存均衡(方法很原始,就是简单的内存移动)。这个选项对UMA系统无效。
[提示]UMA系统的例子:(1)只有一颗物理CPU(即使是多核)的电脑,(2)不支持“虚拟NUMA”,或“虚拟NUMA”被禁用的虚拟机(即使所在的物理机是NUMA系统)。
Automatically enable NUMA aware memory/task placement
在NUMA(Non-Uniform Memory Access Architecture)系统上自动启用内存/进程均衡,也就是自动开启CONFIG_NUMA_BALANCING特性。
如果在NUMA的机器上设置了该选项,那么NUMA自动平衡就会启用。在NUMA下,处理器可以比非本地内存(内存分配给另外一个处理器或在处理器之间共享的内存)更快地访问它的本地内存。
Control Group support
Cgroup支持
Memory Controller
为cgroup添加内存资源控制器,包含匿名内存和页面缓存(Documentation/cgroups/memory.txt)。开启此选项后,将会增加关联到每个内存页fixed memory大小,具体在64位系统上是40bytes/PAGE_SIZE。仅在你确实明白什么是 memory controller 并且确实需要的情况下才开启此选项。此功能可以通过命令行选项“cgroup_disable=memory”进行关闭。
Swap Controller
给 Memory Resource Controller 添加对swap的管理功能。这样就可以针对每个cgroup限定其使用的mem+swap总量。如果关闭此选项, memory controller 将仅能限制mem的使用量,而无法对swap进行控制(进程有可能耗尽swap)。开启此功能会对性能有不利影响,并且为了追踪swap的使用也会消耗更多的内存(如果swap的页面大小是4KB,那么每1GB的swap需要额外消耗512KB内存),所以在内存较小的系统上不建议开启。
Swap Controller enabled by default
如果开启此选项,那么将默认开启CONFIG_MEMCG_SWAP特性,否则将默认关闭。即使默认开启也可以通过内核引导参数“swapaccount=0”禁止此特性。
IO controller
通用的块IO控制器接口,可以用于实现各种不同的控制策略。目前,IOSCHED_CFQ用它来在不同的cgroup之间分配磁盘IO带宽(需要额外开启CONFIG_CFQ_GROUP_IOSCHED),block io throttle也会用它来针对特定块设备限制IO速率上限(需要额外开启CONFIG_BLK_DEV_THROTTLING)。
CPU Controller
让CPU调度程序可以在不同的cgroup之间分配CPU的带宽。
Group scheduling for SCHED_OTHER
公平CPU调度策略,也就是在多个cgroup之间平均分配CPU带宽。“鸡血补丁”CONFIG_SCHED_AUTOGROUP(自动分组调度功能)依赖于它。
CPU bandwidth provisioning for FAIR_GROUP_SCHED
允许用户为运行在CONFIG_FAIR_GROUP_SCHED中的进程定义CPU带宽限制。对于没有定义CPU带宽限制的cgroup而言,可以无限制的使用CPU带宽。
Group scheduling for SCHED_RR/FIFO
允许用户为cgroup分配实时CPU带宽,还可以对非特权用户的实时进程组进行调度。
Freezer Controller
允许冻结/解冻cgroup内所有进程
HugeTLB Controller
为cgroup添加对HugeTLB页的资源控制功能。开启此选项之后,你就可以针对每个cgroup限定其对HugeTLB的使用。
Cpuset Controller
CPUSET支持:允许将CPU和内存进行分组,并指定某些进程只能运行于特定的分组。
Include legacy /proc//cpuset file
提供过时的 /proc//cpuset 文件接口
Device controller
允许为cgroup建立设备白名单,这样cgroup内的进程将仅允许对白名单中的设备进行mknod/open操作。
Simple CPU accounting controller
提供一个简单的资源控制器(Resource Controller,用于实现一组任务间的资源共享),以监控cgroup内所有进程的总CPU使用量。
Perf controller
将per-cpu模式进行扩展,使其可以监控属于特定cgroup并运行于特定CPU上的线程。
Example controller
导出cgroups框架的调试信息,仅用于调试目的。
Namespaces support
命名空间支持。用于支持基于容器的轻量级虚拟化技术(比如LXC)。