【问题标题】:Creating an empty file to force the hypervisor to grow the real filesystem创建一个空文件来强制管理程序增长真实的文件系统
【发布时间】:2011-05-04 00:47:29
【问题描述】:

我正在使用 Amazon EC2 和 CloudLayer 等云计算机。高清性能是瓶颈。

我从 CloudLayer 获得的一个技巧是使用 5GB 的大文件来扩展我的文件系统,这样他们就不必在每次写入磁盘时都扩展它。我编写了这个 Powershell 脚本,但是因为这会创建空值,所以我不确定虚拟机管理程序是否真的会增长底层文件系统文件。

如何验证它确实有效?

#Find all local drives
get-psdrive -PSProvider 'FileSystem' | where {$_.Root -like '?:\'} | foreach {
    $msg1 = "Drive " + $_.Name + " has " + $_.Free + " bytes"
    Write-Host $msg1        

    #Create a file the size of the empty space on the drive.
    $fileNameAndPath = $_.Root + 'BIG_TEMP_FILE_DELETE_THIS.dat'
    $f = new-object System.IO.FileStream $fileNameAndPath, Create, ReadWrite
    $f.SetLength($_.Free)
    $f.Close()
}

他们的解释:

如果您在自己的工作站上尝试过虚拟化,CCI 使用平面文件来存储文件系统内容 (.vdx),这可能看起来很熟悉。创建 VM 时,您指定最大虚拟驱动器大小,但平面文件或 .vdx 仅与操作系统安装所需的空间一样大,并且平面文件会随着您需要更多空间而相应增长。

当只有少量虚拟主机需要在平面文件上分配额外空间然后写入它时会非常快速和透明地发生,但是,当写入共享存储介质时,分配将内容写入磁盘之前的额外空间对读写性能的影响更大。

您可以通过在平面文件上预先分配空间来提高性能,这是通过在系统使用量较低(约 5GB)时将大文件写入驱动器然后删除文件来实现的你刚刚创建。这将使平面文件的大小与测试文件成正比,删除它会再次释放空间以供使用。

现在,当您使用存储介质时,管理程序无需浪费时间在 SAN 上分配额外空间,同时尝试写入您的虚拟驱动器。

【问题讨论】:

  • 我想验证它是否有效的唯一方法是查看性能瓶颈是否消失。
  • 我会尝试衡量它,但这很难:一旦你让它成长,它就是永远!

标签: powershell cloud-hosting


【解决方案1】:

如果您担心文件是否被填充,您可以轻松地初始化一个字节数组,.NET 将保证初始化的字节设置为 0。您可以使用它来将实际数据写入磁盘.

# write 4K worth of data at a time
$bufSize = 4096
$bytes = New-Object byte[] $bufSize
$file = [System.IO.File]::Create("C:\big.raw")
# write the first block out to accommodate integer division truncation
$file.Write($bytes, 0, $bufSize)
for ($i = 0; $i -lt $_.Free; $i = $i + $bufSize) { $file.Write($bytes, 0, $bufSize) }
$file.Close()

【讨论】:

  • 很遗憾 OP 从未回来并将其标记为正确。这是一个方便的 sn-p 代码,可以剪切并粘贴到 PS 会话中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2017-01-06
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2013-10-30
  • 2018-06-21
相关资源
最近更新 更多