当前位置:首页 » 硬盘大全 » 正在写入缓存linux
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

正在写入缓存linux

发布时间: 2023-02-10 22:40:06

Ⅰ 为什么write有时候在linux里面耗时很久

#include ssize_t write(int filedes, void *buf, size_t nbytes); // 返回:若成功则返回写入的字节数,若出错则返回-1 // filedes:文件描述符 // buf:待写入数据缓存区 // nbytes:要写入的字节数 同样,为了保证写入数据的完整性,在《UNIX网...

Ⅱ 请问大侠,在linux下如何动态查看一个正在写入的文件内容

写入命令commond & tail -f filename

Ⅲ linux系统性能怎么优化

linux系统性能怎么优化
一、前提
我们可以在文章的开始就列出一个列表,列出可能影响Linux操作系统性能的一些调优参数,但这样做其实并没有什么价值。因为性能调优是一个非常困难的任务,它要求对硬件、操作系统、和应用都有着相当深入的了解。如果性能调优非常简单的话,那些我们要列出的调优参数早就写入硬件的微码或者操作系统中了,我们就没有必要再继续读这篇文章了。正如下图所示,服务器的性能受到很多因素的影响。
当面对一个使用单独IDE硬盘的,有20000用户的数据库服务器时,即使我们使用数周时间去调整I/O子系统也是徒劳无功的,通常一个新的驱动或者应用程序的一个更新(如SQL优化)却可以使这个服务器的性能得到明显的提升。正如我们前面提到的,不要忘记系统的性能是受多方面因素影响的。理解操作系统管理系统资源的方法将帮助我们在面对问题时更好的判断应该对哪个子系统进行调整。
二、Linux的CPU调度
任何计算机的基本功能都十分简单,那就是计算。为了实现计算的功能就必须有一个方法去管理计算资源、处理器和计算任务(也被叫做线程或者进程)。非常感谢Ingo Molnar,他为Linux内核带来了O(1)CPU调度器,区别于旧有的O(n)调度器,新的调度器是动态的,可以支持负载均衡,并以恒定的速度进行操作。
新调度器的可扩展性非常好,无论进程数量或者处理器数量,并且调度器本身的系统开销更少。新调取器的算法使用两个优先级队列。
引用
・活动运行队列
・过期运行队列
调度器的一个重要目标是根据优先级权限有效地为进程分配CPU 时间片,当分配完成后它被列在CPU的运行队列中,除了 CPU 的运行队列之外,还有一个过期运行队列。当活动运行队列中的一个任务用光自己的时间片之后,它就被移动到过期运行队列中。在移动过程中,会对其时间片重新进行计算。如果活动运行队列中已经没有某个给定优先级的任务了,那么指向活动运行队列和过期运行队列的指针就会交换,这样就可以让过期优先级列表变成活动优先级的列表。通常交互式进程(相对与实时进程而言)都有一个较高的优先级,它占有更长的时间片,比低优先级的进程获得更多的计算时间,但通过调度器自身的调整并不会使低优先级的进程完全被饿死。新调度器的优势是显着的改变Linux内核的可扩展性,使新内核可以更好的处理一些有大量进程、大量处理器组成的企业级应用。新的O(1)调度器包含仔2.6内核中,但是也向下兼容2.4内核。
新调度器另外一个重要的优势是体现在对NUMA(non-uniform memory architecture)和SMP(symmetric multithreading processors)的支持上,例如INTEL@的超线程技术。
改进的NUMA支持保证了负载均衡不会发生在CECs或者NUMA节点之间,除非发生一个节点的超出负载限度。
三、Linux的内存架构
今天我们面对选择32位操作系统还是64位操作系统的情况。对企业级用户它们之间最大的区别是64位操作系统可以支持大于4GB的内存寻址。从性能角度来讲,我们需要了解32位和64位操作系统都是如何进行物理内存和虚拟内存的映射的。
在上面图示中我们可以看到64位和32位Linux内核在寻址上有着显着的不同。
在32位架构中,比如IA-32,Linux内核可以直接寻址的范围只有物理内存的第一个GB(如果去掉保留部分还剩下896MB),访问内存必须被映射到这小于1GB的所谓ZONE_NORMAL空间中,这个操作是由应用程序完成的。但是分配在ZONE_HIGHMEM中的内存页将导致性能的降低。
在另一方面,64位架构比如x86-64(也称作EM64T或者AMD64)。ZONE_NORMAL空间将扩展到64GB或者128GB(实际上可以更多,但是这个数值受到操作系统本身支持内存容量的限制)。正如我们看到的,使用64位操作系统我们排除了因ZONE_HIGHMEM部分内存对性能的影响的情况。
实际中,在32位架构下,由于上面所描述的内存寻址问题,对于大内存,高负载应用,会导致死机或严重缓慢等问题。虽然使用hugemen核心可缓解,但采取x86_64架构是最佳的解决办法。
四、虚拟内存管理
因为操作系统将内存都映射为虚拟内存,所以操作系统的物理内存结构对用户和应用来说通常都是不可见的。如果想要理解Linux系统内存的调优,我们必须了解Linux的虚拟内存机制。应用程序并不分配物理内存,而是向Linux内核请求一部分映射为虚拟内存的内存空间。如下图所示虚拟内存并不一定是映射物理内存中的空间,如果应用程序有一个大容量的请求,也可能会被映射到在磁盘子系统中的swap空间中。
另外要提到的是,通常应用程序不直接将数据写到磁盘子系统中,而是写入缓存和缓冲区中。Bdflush守护进程将定时将缓存或者缓冲区中的数据写到硬盘上。
Linux内核处理数据写入磁盘子系统和管理磁盘缓存是紧密联系在一起的。相对于其他的操作系统都是在内存中分配指定的一部分作为磁盘缓存,Linux处理内存更加有效,默认情况下虚拟内存管理器分配所有可用内存空间作为磁盘缓存,这就是为什么有时我们观察一个配置有数G内存的Linux系统可用内存只有20MB的原因。
同时Linux使用swap空间的机制也是相当高效率的,如上图所示虚拟内存空间是由物理内存和磁盘子系统中的swap空间共同组成的。如果虚拟内存管理器发现一个已经分配完成的内存分页已经长时间没有被调用,它将把这部分内存分页移到swap空间中。经常我们会发现一些守护进程,比如getty,会随系统启动但是却很少会被应用到。这时为了释放昂贵的主内存资源,系统会将这部分内存分页移动到swap空间中。上述就是Linux使用swap空间的机制,当swap分区使用超过50%时,并不意味着物理内存的使用已经达到瓶颈了,swap空间只是Linux内核更好的使用系统资源的一种方法。
简单理解:Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。下面的事例是好的状态:
引用
# vmstat
procs ———–memory————- —swap– —–io—- –system– —-cpu—-
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 5696 6904 28192 50496 0 0 88 117 61 29 11 8 80 1
五、模块化的I/O调度器
就象我们知道的Linux2.6内核为我们带来了很多新的特性,这其中就包括了新的I/O调度机制。旧的2.4内核使用一个单一的I/O调度器,2.6 内核为我们提供了四个可选择的I/O调度器。因为Linux系统应用在很广阔的范围里,不同的应用对I/O设备和负载的要求都不相同,例如一个笔记本电脑和一个10000用户的数据库服务器对I/O的要求肯定有着很大的区别。
引用
(1).Anticipatory
anticipatory I/O调度器创建假设一个块设备只有一个物理的查找磁头(例如一个单独的SATA硬盘),正如anticipatory调度器名字一样,anticipatory调度器使用“anticipatory”的算法写入硬盘一个比较大的数据流代替写入多个随机的小的数据流,这样有可能导致写 I/O操作的一些延时。这个调度器适用于通常的一些应用,比如大部分的个人电脑。
(2).Complete Fair Queuing (CFQ)
Complete Fair Queuing(CFQ)调度器是Red Flag DC Server 5使用的标准算法。CFQ调度器使用QoS策略为系统内的所有任务分配相同的带宽。CFQ调度器适用于有大量计算进程的多用户系统。它试图避免进程被饿死和实现了比较低的延迟。
(3).Deadline
deadline调度器是使用deadline算法的轮询的调度器,提供对I/O子系统接近实时的操作,deadline调度器提供了很小的延迟和维持一个很好的磁盘吞吐量。如果使用deadline算法请确保进程资源分配不会出现问题。
(4).NOOP
NOOP调度器是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。
六、网络子系统
新的网络中断缓和(NAPI)对网络子系统带来了改变,提高了大流量网络的性能。Linux内核在处理网络堆栈时,相比降低系统占用率和高吞吐量更关注可靠性和低延迟。所以在某些情况下,Linux建立一个防火墙或者文件、打印、数据库等企业级应用的性能可能会低于相同配置的Windows服务器。
在传统的处理网络封包的方式中,如下图蓝色箭头所描述的,一个以太网封包到达网卡接口后,如果MAC地址相符合会被送到网卡的缓冲区中。网卡然后将封包移到操作系统内核的网络缓冲区中并且对CPU发出一个硬中断,CPU会处理这个封包到相应的网络堆栈中,可能是一个TCP端口或者Apache应用中。
这是一个处理网络封包的简单的流程,但从中我们可以看到这个处理方式的缺点。正如我们看到的,每次适合网络封包到达网络接口都将对CPU发出一个硬中断信号,中断CPU正在处理的其他任务,导致切换动作和对CPU缓存的操作。你可能认为当只有少量的网络封包到达网卡的情况下这并不是个问题,但是千兆网络和现代的应用将带来每秒钟成千上万的网络数据,这就有可能对性能造成不良的影响。
正是因为这个情况,NAPI在处理网络通讯的时候引入了计数机制。对第一个封包,NAPI以传统的方式进行处理,但是对后面的封包,网卡引入了POLL 的轮询机制:如果一个封包在网卡DMA环的缓存中,就不再为这个封包申请新的中断,直到最后一个封包被处理或者缓冲区被耗尽。这样就有效的减少了因为过多的中断CPU对系统性能的影响。同时,NAPI通过创建可以被多处理器执行的软中断改善了系统的可扩展性。NAPI将为大量的企业级多处理器平台带来帮助,它要求一个启用NAPI的驱动程序。在今天很多驱动程序默认没有启用NAPI,这就为我们调优网络子系统的性能提供了更广阔的空间。
七、理解Linux调优参数
因为Linux是一个开源操作系统,所以又大量可用的性能监测工具。对这些工具的选择取决于你的个人喜好和对数据细节的要求。所有的性能监测工具都是按照同样的规则来工作的,所以无论你使用哪种监测工具都需要理解这些参数。下面列出了一些重要的参数,有效的理解它们是很有用处的。
(1)处理器参数
引用
・CPU utilization
这是一个很简单的参数,它直观的描述了每个CPU的利用率。在xSeries架构中,如果CPU的利用率长时间的超过80%,就可能是出现了处理器的瓶颈。
・Runable processes
这个值描述了正在准备被执行的进程,在一个持续时间里这个值不应该超过物理CPU数量的10倍,否则CPU方面就可能存在瓶颈。
・Blocked
描述了那些因为等待I/O操作结束而不能被执行的进程,Blocked可能指出你正面临I/O瓶颈。
・User time
描述了处理用户进程的百分比,包括nice time。如果User time的值很高,说明系统性能用在处理实际的工作。
・System time
描述了CPU花费在处理内核操作包括IRQ和软件中断上面的百分比。如果system time很高说明系统可能存在网络或者驱动堆栈方面的瓶颈。一个系统通常只花费很少的时间去处理内核的操作。
・Idle time
描述了CPU空闲的百分比。
・Nice time
描述了CPU花费在处理re-nicing进程的百分比。
・Context switch
系统中线程之间进行交换的数量。
・Waiting
CPU花费在等待I/O操作上的总时间,与blocked相似,一个系统不应该花费太多的时间在等待I/O操作上,否则你应该进一步检测I/O子系统是否存在瓶颈。
・Interrupts
Interrupts 值包括硬Interrupts和软Interrupts,硬Interrupts会对系统性能带来更多的不利影响。高的Interrupts值指出系统可能存在一个软件的瓶颈,可能是内核或者驱动程序。注意Interrupts值中包括CPU时钟导致的中断(现代的xServer系统每秒1000个 Interrupts值)。
(2)内存参数
引用
・Free memory
相比其他操作系统,Linux空闲内存的值不应该做为一个性能参考的重要指标,因为就像我们之前提到过的,Linux内核会分配大量没有被使用的内存作为文件系统的缓存,所以这个值通常都比较小。
・Swap usage
这 个值描述了已经被使用的swap空间。Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。
・Buffer and cache
这个值描述了为文件系统和块设备分配的缓存。在Red Flag DC Server 5版本中,你可以通过修改/proc/sys/vm中的page_cache_tuning来调整空闲内存中作为缓存的数量。
・Slabs
描述了内核使用的内存空间,注意内核的页面是不能被交换到磁盘上的。
・Active versus inactive memory
提供了关于系统内存的active内存信息,Inactive内存是被kswapd守护进程交换到磁盘上的空间。
(3)网络参数
引用
・Packets received and sent
这个参数表示了一个指定网卡接收和发送的数据包的数量。
・Bytes received and sent
这个参数表示了一个指定网卡接收和发送的数据包的字节数。
・Collisions per second
这个值提供了发生在指定网卡上的网络冲突的数量。持续的出现这个值代表在网络架构上出现了瓶颈,而不是在服务器端出现的问题。在正常配置的网络中冲突是非常少见的,除非用户的网络环境都是由hub组成。
・Packets dropped
这个值表示了被内核丢掉的数据包数量,可能是因为防火墙或者是网络缓存的缺乏。
・Overruns
Overruns表达了超出网络接口缓存的次数,这个参数应该和packets dropped值联系到一起来判断是否存在在网络缓存或者网络队列过长方面的瓶颈。
・Errors 这个值记录了标志为失败的帧的数量。这个可能由错误的网络配置或者部分网线损坏导致,在铜口千兆以太网环境中部分网线的损害是影响性能的一个重要因素。
(4)块设备参数
引用
・Iowait
CPU等待I/O操作所花费的时间。这个值持续很高通常可能是I/O瓶颈所导致的。
・Average queue length
I/O请求的数量,通常一个磁盘队列值为2到3为最佳情况,更高的值说明系统可能存在I/O瓶颈。
・Average wait
响应一个I/O操作的平均时间。Average wait包括实际I/O操作的时间和在I/O队列里等待的时间。
・Transfers per second
描述每秒执行多少次I/O操作(包括读和写)。Transfers per second的值与kBytes per second结合起来可以帮助你估计系统的平均传输块大小,这个传输块大小通常和磁盘子系统的条带化大小相符合可以获得最好的性能。
・Blocks read/write per second
这个值表达了每秒读写的blocks数量,在2.6内核中blocks是1024bytes,在早些的内核版本中blocks可以是不同的大小,从512bytes到4kb。
・Kilobytes per second read/write
按照kb为单位表示读写块设备的实际数据的数量。

Ⅳ Linux编程基础知识进阶篇(指令)

linux常用的语言就是shell和python,首先我们得先了解语言的概念

<<-EOF
EOF

编写一个简单的bash档如下:

我们可以看到用./执行bash档时,没有进入到/home目录下,这种我们称为 在子shell中执行 ,其不影响当前shell的状况(有时候执行成功没有效果的原因)。但是无论是. 执行还是source执行我们都成功进入了home路径下,这我们称之为 在当前shell执行

su nologinshell 不加载用户的shell
su - loginshell 加载用户的shell

可以很明显的看出来,当用不加载用户的shell加载用户时,是不会具有当前加载用户的权限的,很像windows中的游客模式

history历史记录缓存
~/.bash_history退出后写入缓存
~/.bash_logout退出后执行

在这一层,顺带按图索骥,理解一下linux系统开机的历程。红字:系统层开机/切换用户历程;蓝字:用户层开机/切换用户历程;黄字:用户层关机历程。
曾经玩过一个游戏:在用户指令关机时,会有一辆小火车开过,所以我们可以把调用小火车开过的程式调用写在?

1、命令和文件的自动补齐 shift
2、命令的历史记忆功能:上下键、!number 执行第多少条命令、
!string 找到最近以string开头的命令、!& 上一个命令最后的参数、
!! 执行上一个命令、^R 搜索历史命令
3、别名功能:alias 查看别名、unalias 取消别名、(命名前加斜线跳过别名)
alias xx=’xx’ 定义临时别名、vim ~/.bashrc 定义永久别名
4.快捷键:^D 退出、^A 光标移动到命令最前、^E 光标移动到命令最后、
^L 清屏、^U 往前的删掉、^K 往后的删掉、^Y 撤销、^M 回车
^S 锁屏、^Q 解除锁屏
5.前后台作业控制:& 后台不保留、nohup 后台保留、screen

; && || (命令返回值echo &?)

*任意多个字符
?任意一个字符
[]匹配括号内任意一个字符
()在子shell中执行
{}集合
转义字符
注意点:echo -e “a b”

$? 前一条命令的执行成功与否
$1 传入的第一个参数 $2 $3 位置变量

没有使用环境变量的必要性

练习内容:读取用户指定文档的ip连通性

bc计算器

假设我们定义了一个变量为:

记忆的方法为:

利用${ } 还可针对不同的变数状态赋值(没设定、空值、非空值):

Ⅳ linux google earth 无法写入缓存

写入缓存是一种能够把对磁盘的写入操作暂时缓存起来,然后等到系统空闲的时候再执行相应操作的工作模式,能够提升系统性能。通常造成写入缓存错误的原因是磁盘子系统与内存子系统发生故障。你可以检查硬盘线、硬盘本身、内存条是否工作正常,用替换法就可以。另外,还要确认主板驱动程序安装正常、Bios中硬盘的各项参数设置正确。
“写入缓存”选项是如何设置的吗?请打开“设备管理器”,展开“磁盘驱动器”,接着在下面任何一个驱动器图标上点击鼠标右键并选择“属性”,然后切换到“策略”标签。在这里你应该会看到两个选项:“为快速删除而优化”(所有的东西都直接写入硬盘驱动器)和“为提高性能而优化”(写入到缓存)。第一个选项可以允许你快速的断开设备与电脑的连接,例如一个usb闪存,你不用点击任务栏里面的“安全删除硬件”图标就可以直接把这些设备和电脑断开。如果两个选项都处于灰色无法选择的状态,那么说明你的磁盘驱动器默认已经把“写入缓存”选
项打开了。

在Windows Xp系统中有时候会弹出“写入缓存失败”的提示,告诉你延缓写入系统可能存在一些问题。虽然这并不是什么致命错误,
不过也值得引起你足够的关注。

下面是一些常见的引起“写入缓存失败”的原因
1.磁盘驱动器本身的原因。这种情况尤其发生scsi或者raid驱动器上。有一些
raid驱动器的驱动程序会在安装了Windows Xp Sp2的Windows Xp操作系统中
报告一个虚假消息告诉用户“写入缓存失败”。所以你应该为你的磁盘驱动器安装最新版本的驱动程序。
2.数据线的原因。一些错误或者损坏的数据线,特别是外部usb线和火线,会
造成这种情况。如果你的数据线过长,或者数据线连接到的是一个质量不合格
的usb hub上,也会造成写入缓存失败。最后,还有可能是因为你有一个需要80
针数据线的udma驱动器,但你却使用了一条40针脚的数据线。
3.scsi终止错误。虽然这种情况在使用了self-terminating技术的scsi设备上很少发生,但是我们还是必须把它考虑进来。
4.媒体错误。这是可能发生的最严重的情况,换句话说,也就是磁盘驱动器坏了。
如果你能通过smart(比如smart & simple )软件获取磁盘驱动器的统计信息,那么你可以通过这些信息来判断磁盘驱动器出现了机械(物理)故障。你还可以使用一个叫gibson research's spinrite的工具来帮助你诊断媒体错误,只是这个软件在对磁盘驱动器进行完全检测的时候会耗费相当长的时间。
5.计算机的Bios设定强制开启了驱动器控制器不支持的udma模式。虽然udma
模式能够增强磁盘的性能,但是如果驱动器控制器不支持的话将会导致一些错误
发生。这种情况并不多见,主要是发生在新安装的硬件设备上(该硬件设备支持
udma模式),用户可以通过升级bios或者将bios中关于硬盘驱动器的选项恢复成
默认的“自动检测”模式来解决这个问题。举个例子:如果设置成udma mode6模
式的设备出现了问题,那么你可以将它设置成mode5模式。
6.驱动器控制器的问题。我曾经遇到usb控制器和其他硬件设备冲突并产生写入
缓存失败的情况。如果你的系统同时拥有长和短两种pci插槽(64位和32位),
请尝试将usb控制器从长pci插槽中拔出。一些比较老的pci 卡并不支持这种类型的插槽。
7.内存的奇偶校验错误。这种情况通常发生在你新增了一条内存之后,造成这
种错误的原因是很可能是你的新内存条和主板所支持的内存类型不符,或者是
内存本身有问题。(内存有问题还会造成其他一些错误,例如随机死锁等)
8.注册表中的largesystemcache键值错误。这种情况很少见,通常发生在那
些安装了ati显示适配器,内存大于521mb的机器上。这些机器上的注册表中有
一个叫做largesystemcache的键 hkey localmachine\system\currentcontrolset\control\session manager\memory management该键值用来管理系统分配给一些核心进程的内存容量,如果键值被设为1的话(这样设置可以增强内存大于512mb的机器的性能),有可能会在一些系统中导致数据错误和产生写入缓存失败的错误。如果出现这种情况的话,请把该键值改为0。

Ⅵ linux系统中怎么弹出U盘,可以直接拔吗

取消挂载即可拔出,不可直接拔。


详细操作:

  1. 终端输入df查看挂载点。

  2. 使用umount卸载此设备。如设备忙无法卸载可用umount -l。可能需要root权限。

  3. 对于有图形界面的系统如ubuntu直接在文件管理器里右击U盘卸载即可。


注意事项:

  1. 如果不卸载直接拔,可能让正在使用文件的进程崩溃。

  2. 如果正在写入,直接拔会损坏文件,严重者会损坏闪存。

  3. linux有写入缓存机制,直接拔会让看似写入完毕的文件消失。

Ⅶ linux怎样提升磁盘读写性能

关于页面缓存的信息,可以用
cat /proc/meminfo
看到。其中的Cached 指用于pagecache的内存大小(diskcache-SwapCache)。随着写入缓存页,Dirty 的值会增加。
一旦开始把缓存页写入硬盘,Writeback的值会增加直到写入结束。

Linux 用pdflush进程把数据从缓存页写入硬盘,查看有多少个pdflush进程
cat /proc/sys/vm/nr_pdflush_threads

pdflush的行为受/proc/sys/vm中的参数的控制
/proc/sys/vm/dirty_writeback_centisecs (default 500):
1/100秒, 多长时间唤醒pdflush将缓存页数据写入硬盘。默认5秒唤醒2个(更多个)线程。
如果wrteback的时间长于dirty_writeback_centisecs的时间,可能会出问题。

pdflush的第一件事是读取
/proc/sys/vm/dirty_expire_centiseconds (default 3000)
1/100秒。缓存页里数据的过期时间(旧数据),在下一个周期内被写入硬盘。默认30秒是一个很长的时间。

第二件事是判断内存是否到了要写入硬盘的限额,由参数决定:
/proc/sys/vm/dirty_background_ratio (default 10)
百分值,保留过期页缓存(脏页缓存)的最大值。是以MmeFree+Cached-Mapped的值为基准的

pdflush写入硬盘看两个参数:
1 数据在页缓存中是否超出30秒,如果是,标记为脏页缓存;
2 脏页缓存是否达到工作内存的10%;

以下参数也会影响到pdflush
/proc/sys/vm/dirty_ratio (default 40)
总内存的最大百分比,系统所能拥有的最大脏页缓存的总量。超过这个值,开启pdflush写入硬盘。如果cache增长快于pdflush,那么整个系统在40%的时候遇到I/O瓶颈,所有的I/O都要等待cache被pdflush进硬盘后才能重新开始。

对于有高度写入操作的系统
dirty_background_ratio: 主要调整参数。如果需要把缓存持续的而不是一下子大量的写入硬盘,降低这个值。
dirty_ratio: 第二调整参数。

Swapping参数
/proc/sys/vm/swappiness
默认,linux倾向于从物理内存映射到硬盘缓存,保持硬盘缓存尽可能大。未用的页缓存会被放进swap区。
数值为0,将会避免使用swapping
100,将会尽量使用swapping
少用swapping会增加程序的响应速度;多用swapping将会提高系统的可用性。

如果有大量的写操作,为避免I/O的长时间等待,可以设置:
$ echo 5 > /proc/sys/vm/dirty_background_ratio
$ echo 10 > /proc/sys/vm/dirty_ratio

文件系统数据缓冲需要频繁的内存分配。加大保留内存的值能提升系统速度和稳定。小于8G的内存,保留内存为64M,大于8G的设置为256M
$ echo 65536 > /proc/sys/vm/min_free_kbytes


I/O 调度器
cat /sys/block/[disk]/queue/scheler

4中调度算法
noop anticipatory deadline [cfq]
deadline : deadline 算法保证对既定的IO请求以最小的延迟时间。
anticipatory: 有个IO发生后,如果又有进程请求IO,则产生一个默认6ms猜测时间,猜测下一个进程请求IO是干什么。这对于随机读取会造成较大的延时。
对数据库应用很糟糕,而对于Web Server等则会表现不错。
cfq: 对每个进程维护一个IO队列,各个进程发来的IO请求会被cfq以轮循方式处理,对每一个IO请求都是公平。适合离散读的应用。
noop: 对所有IO请求都用FIFO队列形式处理。默认IO不会存在性能问题。

改变调度器
$ echo deadline > /sys/block/sdX/queue/scheler
对于数据库服务器,deadline算法是推荐的。

提高调度器请求队列的
$ echo 4096 > /sys/block/sdX/queue/nr_requests

有大量的读请求,默认的请求队列应付不过来,可以提高这个值。缺点是要牺牲一定的内存。
为了增加连续读取的吞吐量,可以增加预读数据量。预读的实际值是自适应的,所以使用一个较高的值,不会降低小型随机存取的性能。
$ echo 4096 > /sys/block/sdX/queue/read_ahead_kb
如果LINUX判断一个进程在顺序读取文件,那么它会提前读取进程所需文件的数据,放在缓存中。服务器遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒)。通过调整内核参数,将写活动的高峰分布成频繁的多次写,每次写入的数据比较少。这样可以把尖峰的写操作削平成多次写操作。以这种方式执行的效率比较低,因为内核不太有机会组合写操作。但对于繁忙的服务器,写操作将更一致地进行,并将极大地改进交互式性能。

/proc/sys/vm/dirty_ratio

控制文件系统的写缓冲区的大小,单位是百分比,表示占系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值。

/proc/sys/vm/dirty_background_ratio

控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,pdflush用于将内存中的内容和文件系统进行同步,比如说,当一个文件在内存中进行修改,pdflush负责将它写回硬盘.每当内存中的垃圾页(dirty page)超过10%的时候,pdflush就会将这些页面备份回硬盘.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值:

/proc/sys/vm/dirty_writeback_centisecs

控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。
如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值。
该参数的设置应该小于dirty_expire_centisecs,但也不能太小,太小I/O太频繁,反而
使系统性能下降。具体可能需要在生产环境上测试。据说1:6 (dirty_expire_centisecs : dirty_writeback_centisecs )的比例比较好。

/proc/sys/vm/dirty_expire_centisecs

声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。
当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。

/proc/sys/vm/vfs_cache_pressure

表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache

/proc/sys/vm/min_free_kbytes

表示强制Linux VM最低保留多少空闲内存(Kbytes)。
缺省设置:724(512M物理内存)

/proc/sys/vm/nr_pdflush_threads

表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。

/proc/sys/vm/overcommit_memory

指定了内核针对内存分配的策略,其值可以是0、1、2。

0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2, 表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。

缺省设置:0

/proc/sys/vm/overcommit_ratio

如果overcommit_memory=2,可以过载内存的百分比,通过以下公式来计算系统整体可用内存。系统可分配内存=交换空间+物理内存*overcommit_ratio/100
缺省设置:50(%)

/proc/sys/vm/page-cluster

表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。
缺省设置:3(2的3次方,8页)

/proc/sys/vm/swapiness

表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。

更改:
/etc/sysctl.conf

vm.dirty_ratio=40

sysctl -p

查看:

find /proc/sys/vm -name dirty* -print | while read name; do echo $name ;cat ${name}; done

Ⅷ linux shell 如何把数据写入缓存区,然后在写入磁盘

linux的shell用一个exec函数把用户的命令来执行,数据写入的时候,先把数据写入到内核的缓冲区,使用write函数(linux的系统调用函数),在数据去满或者sync的时候,再把数据写入到磁盘,把数据写入到磁盘的时候使用cpu来写,写的细节,大概是cpu把所有的外设(注入磁盘,键盘,鼠标等)都有一个端口可以直接访问,不过需要有对应的驱动程序,写的时候就通过对应的接口来写,真正想彻底了解的话,必须要读linux内核代码了。。。。