Home | 문태준 | 시스템어드민 메일링 | Sys Admin 세미나
Skip to end of metadata
Go to start of metadata

http://blogs.zdnet.com/storage/?p=130

여기서는 i/o request size가 클 경우 디스크에서 얼마나 빨리 자료를 가져오느냐(bandwidth)가 중요하고 이 경우 작은 chunks(512B-8KB) 를 사용, i/o request size(512B-4KB)가 작을 경우 iops를 최대화하는 것이 중요하여 큰 chunks(64KB) 를 사용한다고 나옵니다.

  • big I/Os = small chunks, small I/Os = big chunks
  • 비디오 편집, 포토삽 작업을 하는 경우를 생각해보자. 평균 요청 크기(average request size)는 클 것이며 성능은 디스크에서 데이터를 가져오는 시간에 달려있을 것이다. 그래서 데이터를 더 빠르게 가져오기 위해 더 많은 대역폭을 원할 것이다. 더 많은 대역폭을 위해 각 디스크가 부하를 분산하기를 바랄 것이며 작은 chunk size를 원할 것이다. 작은 것은 얼마를 말하는가? 512 bytes (1개의 블락) 에서 8kb 이다. (리눅스에서 block size는 1024,2048, 4096임)
  • 데이터베이스를 운영하고 많은 작은 I/Os (512b bytes - 4KB)가 있으면 IOPS 를 최대화하길 원한 것이다. IOPS 최대화는 개별 I/O는 하나의 디스크로만 보내고 모든 I/O를 각 디스크에 걸쳐 분산해야 한다. head 에서 기다리는 시간이 생기면 속도가 느려지기 때문에 단일 I/O를 두개의 디스크에 보내는 것은 원하지 않을 것이다. 이럴 경우에는 최소 64KB 이상 또는 그 이상의 큰 chunk size를 원할 것이다. chunk size가 크면 대대수의 I/Os를 단일 디스크로 서비스하고 다른 IO/S 는 남아있는 디스크를 이용할 수 있다.
    그러나 많은 db들은 I/O 오버헤드를 최소화하기 위해 I/O를 모으른 자신만의 정책이 있다. 그런 경우에는 해당 DB에서 적절한 chunk size를 고르기 위해 실제로 어떻게 하는지를 이해해야 한다.

Chunk size: the hidden key to RAID performance
Stripes go across disk drives. But how big are the pieces of the stripe on each disk? The pieces a stripe is broken into are called chunks. Is the stripe broken into 1k byte pieces? Or 1 MB pieces? Or even larger? To get good performance you must have a reasonable chunk size.

So what is a reasonable chunk size? It depends on your average I/O request size. Here's the rule of thumb: big I/Os = small chunks; small I/Os = big chunks.

Do you do video editing or a lot of Photoshop work? Then your average request size will be large and your performance will be dominated by how long it takes to get the data to or from the disks. So you want a lot of bandwidth to move data quickly. To get a lot of bandwidth you want each disk to shoulder part of the load, so you want a small chunk size. What is small? Anywhere from 512 bytes (one block) to 8 KB.

If you are running a database and doing lots of small I/Os - 512 bytes to 4 KB say - then you want to maximize your IOPS, which ideally means sending each I/O to only one disk and spreading the I/Os evenly across the disks. What you don't want is a single I/O getting sent to two disks, since waiting for the heads will slow things down. So you want a large chunk size - at least 64 KB or more. That large chunk will mean that most I/Os get serviced by a single disk and more I/Os are available on the remaining disks.

However, many databases use their own strategies to gather I/Os to minimize I/O overhead. In that case you need to know what the database is actually doing to choose the right chunk size.

Labels
  • No labels