我在运行命令时获得了以下 redis 统计信息docker stats。
我想了解 NET I/O 和 BLOCK I/O。我读了一些文档,他们说 BLOCK I/O 与磁盘操作相关。但我不确定这个 NET I/O 是什么。任何人都可以帮助我了解这些吗?
我在 Android 应用程序上调用函数getExternalCacheDir(),这导致某些拥有以下设备(HUAWEI P30 lite、Galaxy A40、Xperia XZ3)的 Android 10 用户出现 ANR。
我的 ANR 的堆栈跟踪如下
The "main" (tid=1) thread is performing disk I/O.
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x72dfcb58 self=0x73e23a5000
| sysTid=12158 nice=0 cgrp=default sched=0/0 handle=0x73e3913ee8
| state=D schedstat=( 378582885 304333911 539 ) utm=23 stm=14 core=7 HZ=100
| stack=0x7fc28de000-0x7fc28e0000 stackSize=8192KB
| held mutexes=
at libcore.io.Linux.access (Native method)
at libcore.io.ForwardingOs.access (ForwardingOs.java:73)
at libcore.io.BlockGuardOs.access (BlockGuardOs.java:71)
at libcore.io.ForwardingOs.access (ForwardingOs.java:73)
at android.app.ActivityThread$AndroidOs.access (ActivityThread.java:7816)
at java.io.UnixFileSystem.checkAccess (UnixFileSystem.java:281)
at java.io.File.exists (File.java:815) …Run Code Online (Sandbox Code Playgroud) 我想测试不同条件下文件系统的性能.
具体来说,我想在没有压缩的情况下测试Windows虚拟机的性能,并且在"普通硬盘"和USB磁盘上都进行压缩测试,因为看看到底有什么区别会很有趣.
我需要的是一个程序,可以测试文件系统的不同方面(随机访问,顺序读/写等),并制作与我的博客很好的漂亮图表.优选地,应用程序应该是自动化的,因此我可以将其添加到启动,这样每次运行的时间相同,我可以重复运行以进行验证.
当我开始测试时,我可以在这里发布一个结果链接.现在正处于规划阶段.
我能想到的替换文件内容的最天真、最糟糕的方法是:
f = open('file.txt', 'w')
f.write('stuff')
f.close()
Run Code Online (Sandbox Code Playgroud)
显然,如果该操作在关闭之前的某个时刻失败,您将丢失原始文件的内容,而不一定完成新内容。
那么,什么是完全正确的方法来做到这一点(如果有的话)。我想它是这样的:
f = open('file.txt.tmp', 'w')
f.write('stuff')
f.close()
move('file.txt.tmp', 'file.txt') # dangerous line?
Run Code Online (Sandbox Code Playgroud)
但这是完全原子的和安全的吗?实际执行移动的正确命令是什么?如果我有另一个进程打开了连接file.txt我假设它将保留指向原始文件的指针,直到关闭。file.txt如果另一个进程试图在移动过程中打开怎么办?
我并不关心我的进程获得的文件版本,只要它们获得完整的、未损坏的版本即可。
我创建了一个程序来测试Linux(Ubuntu)和Windows(Server2008)上的分片MongoDB性能.随着插入大量记录,Windows的磁盘活动时间非常高(100%),那么性能非常糟糕.但在Ubuntu上,磁盘的util%为60%~70%,性能优于Windows.我可以说Linux上的MongoDB性能更好吗?
我有一个亚马逊ec2实例(SAY S1)(4核-7GB内存)使用Ubuntu 12.04,它正在运行我的网络应用程序postgresql 9.1.所有postgres数据都存储在100 GB的不同ssd卷(非root)上.(现在写下它目前只有26%满).
突然间,一天或两天的postgres行动开始耗费大量时间.创建命令(52秒)并恢复数据库(现在9分钟,最多50秒).
通过在运行postgres命令时运行iostat,我可以确认其ec2卷的IOPS已达到其限制(3 IOPS/GB等于100 IOPS的300 IOPS).运行此命令后可以在下面看到它iostat -d 5 -x -p xvdf.
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvdf 0.35 2.28 1.20 298.99 19.65 13082.19 87.29 23.42 78.03 64.19 78.09 3.29 98.75
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvdf 0.00 1.80 0.00 297.40 0.00 13067.20 87.88 126.47 420.75 0.00 420.75 3.35 99.76
Device: rrqm/s wrqm/s r/s w/s …Run Code Online (Sandbox Code Playgroud) 我对大型二进制文件的预读性能有问题。
我的策略是
使用 usleep() 休眠 n 毫秒,仅用于预读性能测量。
重复此操作,直到读取整个文件。
然后,我对上述测量预读性能的策略进行了实验。环境是
在结果中可以看到,当块大小较小且休眠时间足够长以进行预读时,读取时间较短。块大小越大或睡眠时间越短,读取时间越接近约 20 秒。
然后,我想对该图进行回归分析。我应该使用什么功能?我的策略的复杂程度如何?
Docker 在 Windows 10 上非常慢。我执行了很多任务以使索引不在文件夹上运行,并尝试加快速度。该进程似乎占用了 100% 的 CPU,这很好,但也占用了 100% 以上的磁盘 IO,这是一个巨大的瓶颈。在 Linux 或 Mac 上运行不到 10 秒的任务在 Windows 上需要 40 分钟以上才能完成。
这根本无法以任何有意义的方式使用。docker-compose 坚持以 150MB/s 的速度写入磁盘而不是使用 ram 是否有原因?我有大量的内存。我实际上可以将整个 docker-container 系统存储在 ram 中,并且还剩下大约 10GB。
顺便说一句,虽然坚持 docker 只在 Linux 服务器上运行是可行的,但开发必须支持 windows、linux 和 mac。我不敢相信测试没有揭示 Windows 10 支持严重缺乏,不,关闭防病毒软件绝对不是一个选择。许多 docker 开发人员没有适当的权限来执行此操作,建议 docker 用户禁用防病毒功能是一个令人难以置信的请求。还有,禁用杀毒之类的还是不能解答为什么docker占用100%的磁盘IO。
有 8100 万个文件 (!) 存储在远程机器上的一个目录中。所有文件都以“.paintedHaploDiversity”结尾。我想将这些文件合并到一个allOutputs_3.5在父目录中调用的文件中。更具体地说,每个文件包含两行或三行。第一行是我可以忽略的标题。在剩下的一两行中,其中之一具有2第四列中的值。对于每个文件,我想复制2第二列中有 a 的整行,并向其中添加文件名(不包括扩展名“.paintedHaploDiversity”)。我将此文件名称为“simID”。
有关信息,远程计算机在 MAC OS X 10.11.6 (15G22010) 上运行。这是一个简单的桌面。因此不涉及网络(在我的 ssh 命令之外访问远程机器)。
我第一次尝试
for f in *;
do
simID=${f%.paintedHaploDiversity}
awk -v simID=${simID} 'NR>1{if ($4==2) {printf simID"\t"; print}}' $f >> ../allOutputs_3.5
done
Run Code Online (Sandbox Code Playgroud)
但它很慢。我估计需要的时间要几个月甚至几年!然后,我试过了
awk 'FNR==1{simID=substr(FILENAME, 1, length(FILENAME)-22)}FNR>1{if ($4==2) {printf simID"\t"; print}}' * >> ../allOutputs
Run Code Online (Sandbox Code Playgroud)
但它似乎并没有更快。只是作为速度测试,我也考虑过
find . -exec cat '{}' ';' > out
Run Code Online (Sandbox Code Playgroud)
但它又很慢。考虑到问题可能来自正则表达式扩展*,我尝试通过两个 C 样式循环再现每个文件的名称来循环遍历每个文件。
for ((bigID=1; bigID <= 9 ;++bigID)); do
for ((rep=1; rep <= 9000000 ;++rep)); …Run Code Online (Sandbox Code Playgroud) 我很难理解SCAN和CSCAN磁盘调度算法的工作.我理解FCFS,Closest Cylinder Next但是听说SCAN类似于电梯机制而感到困惑.我的书说,对于收到的订单:[10 22 20 2 40 6 38](当盘位于20时)SCAN在开始时移动服务[(20)20 22 38 40 10 6 2]; 这需要移动[0 2 16 2 30 4 4]个气缸,总共58个气缸.模式[(20)20 22 38 40 10 6 2]如何出现?
对于基准脚本,我需要在进行一些操作后立即提取iowait%。
目前,我发现的最好方法是:IOWAIT =top -bn2 | awk '$1~/Cpu/ {print $6}' | sed -n '2p' | tr -d '%wa,'
正确的输出类似于2.1:
首先,如果我不精确地定义“ -bn2”,那么我不知道为什么,如果我只捕获1次,它总是0.1%。所以我进行了两次捕获,然后awk获取iowait字段,然后sed第二行,然后删除了“%wa”
仅供参考,这是输出 top -bn2 | grep Cpu
Cpu(s): 2.8%us, 0.4%sy, 0.0%ni, 96.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st<br>
Cpu(s): 0.2%us, 2.9%sy, 0.0%ni, 87.1%id, 9.5%wa, 0.0%hi, 0.3%si, 0.0%st
Run Code Online (Sandbox Code Playgroud)
我的问题如下:当我得到100.0%的一列(例如空闲)时,它移动了列号,因此我的awk不再起作用,我得到了“ 0.0%hi”字段。
我的问题如下:
-如何告诉awk使用“%wa”进入列?
如果有人对我要做的事情有最好的方法,那么我当然很愿意提出建议!
谢谢
我有一个带有匕首设置的项目,具有以下提供者方法:
@Module(...)
abstract class AppModule {
@Module
companion object {
...
@Provides
@Singleton
@JvmStatic
fun provideSharedPreferences(@AppContext context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
}
@Binds
@AppContext
@Singleton
abstract fun provideAppContext(application: Application): Context
}
Run Code Online (Sandbox Code Playgroud)
这是来自应用程序的代码onCreate():
override fun onCreate() {
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDialog()
.build())
StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.build())
Timber.plant(Timber.DebugTree())
}
...
super.onCreate()
}
Run Code Online (Sandbox Code Playgroud)
在API 27模拟器上运行项目会导致以下行为:

使用以下日志:
D/StrictMode:StrictMode策略违规; 〜duration = 275 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 196671 violation = 2 at android.os.StrictMode $ AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1440)at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java: 251)在java.io.File.exists(File.java:807)的android.app.ContextImpl.getDataDir(ContextImpl.java:2197)在Android上的android.app.ContextImpl.getPreferencesDir(ContextImpl.java:517).在Android.pretent.PreferenceManager.getDefaultSharedPreferences的android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:167)的android.app.ContextImpl.getSharedPreferences(ContextImpl.java:368)上的app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:714) (PreferenceManager.java:526)com.some.package.di.module.AppModule $ Companion.provideSharedPreferences(AppModule.kt:112)...
这意味着,是 …
android disk-io kotlin android-sharedpreferences android-strictmode
众所周知,磁盘 I\O 很昂贵。我通常使用 C# 从 .txt 文件中一次读取一行。我突然想到,如果 C# 为您提供一种一次读取 100 行的方法,它需要更少的磁盘往返次数,从而减少时间。这可能吗?有没有人对如何提高效率有任何想法。我在大约一个小时内浏览了一个 100 万行的文件,一次读取和处理一行。我想看看我是否可以大大减少这个时间。
disk-io ×13
linux ×3
android ×2
bash ×2
docker ×2
file ×2
filesystems ×2
performance ×2
windows ×2
amazon-ec2 ×1
awk ×1
benchmarking ×1
c ×1
c# ×1
disk ×1
fread ×1
hard-drive ×1
iostat ×1
iowait ×1
java ×1
kotlin ×1
merge ×1
mongodb ×1
networking ×1
optimization ×1
postgresql ×1
regex ×1
text-files ×1