タグ

aioに関するkamipoのブックマーク (12)

  • バッファキャッシュとAIO(4) - O'Reilly Japan Community Blog

    前回はPOSIX AIOとLinuxカーネルのAIOサポートについて解説しました。今回は、このAIOの使い勝手を良くするため、POSIX AIOインタフェース準拠のライブラリを作成しています。 LinuxネイティブAIOライブラリliblaioの試作 Linux AIOを使用する場合、現在では前述のlibaioの利用が第一候補になりますが、やや使い勝手が悪いため、記事でPOSIX AIOインタフェース準拠のライブラリを試作してみます。Linux AIOではO_DIRECTが前提となるため、この点もやや使い勝手が悪いのですが、SSDなどメモリベースのファイルシステムもありますし、動作は非同期になりませんがio_submit(2)はO_DIRECTがなくとも使用可能ですから、まぁ試しにやってみましょう。 ライブラリ設計要点を挙げます。 Linux AIOにPOSIX AIOインタフェースをか

  • バッファキャッシュとAIO(3) - O'Reilly Japan Community Blog

    前回までファイル I/O 全般について簡単に振り返りました。いよいよ題のAIOに取り掛かります。今回は、POSIXのAIOインタフェースと、LinuxカーネルのAIOサポートについて紹介します。 POSIX AIO インタフェース バッファキャッシュにより緩和されるとはいえ、ファイル I/Oの最終到達地点はディスクですから、同期的なI/Oはやはりその時間が問題視されることがあります。まだバッファキャッシュに存在しないデータを読み取る場合には遅いディスク必ず待たなければなりません。この動作を非同期に行い、待っている間に他の処理を進められるようにするのが非同期 I/O、AIO(Asynchoronous I/O)です。POSIXではaio_read(3)、aio_write(3)、aio_suspend(3)、aio_fsync(3)、aio_return(3)、aio_cancel(3)、

  • バッファキャッシュとAIO(1)

    プロセスがブロックする要因の一つにファイルI/Oがあります。これを同期I/Oと言いますが、POSIXではAIO(非同期 I/O、Asynchronous I/O)も定義しており、I/O中でもプロセスがブロックせず他の処理を進められるようになります。 記事ではバッファキャッシュからファイル I/Oを解説し、Linuxのio_submit(2)を用いたPOSIX準拠のAIOライブラリを試作してみます。 ファイルI/Oとバッファキャッシュ io_submit(2)ではDirect I/Oを用いますが、ライブラリの試作へ進む前にまずファイルI/Oのバッファ(バッファキャッシュ)について整理します。実は単にバッファと言ってしまうと誤解される場面が多くあり、例えばプログラミング入門一般としてファイルI/Oを取り上げる際には、 CPUの動作は速い。ディスクの動作は遅い。 両者の間に速度差を緩和する緩衝

    バッファキャッシュとAIO(1)
  • どうやってI/Oの完了をうけとっているか(準備編) - takkan_mのNo planな日常

    だんだん、だれてきましたが、今度はどのようにio_submit()で発行したI/Oが完了したか、どうかを知るための仕組みを追っかけてみます。 簡単にこの仕組みを説明すると、まずio_setup()で非同期I/Oを処理するための特別なメモリをとります。io_submit()でリクエストされたI/Oはカーネルスレッドで実行され、完了した際にこの特別なメモリに対してアクセスをし、完了したことを通知します。 まず、io_setup()でどのようなことをしているのかを見てみます。 io_setup()関数は、第一引数に発行する最大のI/O要求数、第二引数にio_context_tのポインタを渡され、第一引数の数だけ非同期I/Oを処理できるように準備をし、AIOコンテキストを示すオブジェクトをさすアドレスを第二引数に格納します。AIOコンテキストとは、I/Oコンテキストの一種で、kioctxオブジェク

    どうやってI/Oの完了をうけとっているか(準備編) - takkan_mのNo planな日常
  • システムコールによる非同期I/O API - takkan_mのNo planな日常

    このAPIは、カーネル2.6以降にカーネルに追加された機能をつかうためのシステムコールになります。 カーネルは、非同期I/Oをサポートするために、VFS層のファイルオブジェクト(簡単に説明すると、実際のファイルシステムがファイルに対する操作を保持するオブジェクトだと思います。この中に、f_opというファイル操作のための関数テーブルをもっています。オブジェクト指向におけるスーパークラスのようなものです。)のf_opに、ファイル操作のaio_read()とaio_write()というエントリポイントがもうけられるようになりました。(個人的に、POSIXのAPIと名前がかぶるので、ここで一度混乱しました。Linuxのカーネル周りは、日語に直しているせいかもしれませんが、同じ名前で呼べるけど実は別物というものがいくつかあります。まぁ、でもそれはおいおい) このAPIをもちいると、I/O処理をカー

    システムコールによる非同期I/O API - takkan_mのNo planな日常
  • POSIX準拠の非同期I/O - takkan_mのNo planな日常

    これは、ライブラリ関数として実装されており、以下の関数群を持ちます。 aio_read(),aio_write(),aio_fsync(),aio_error() aio_return(),aio_cancel(),aio_suspend()詳しい使い方は説明しませんが、aio_read(),aio_write()を使い、I/O要求を発行します。I/O要求は、それぞれの関数中で要求を発行した段階で復帰してくれます。 では次のような、aio_readを行うプログラムを書いて、このライブラリ関数がどのように実装されているかを見てみます。aio_readの動作が見たいだけなので、たぶん、この非同期I/Oライブラリの使い方としては、だめだめです。 #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <s

    POSIX準拠の非同期I/O - takkan_mのNo planな日常
  • AsyncIOについて(その2) - 最速配信研究会(@yamaz)

    AsyncIOについて(その1)の続き. NONBlockでIO処理をする方法としてselectとシグナルを使う方法があるというのが前回の話だったが, selectはselectよりkqueue,epollで述べたとおり, ビジーループがかかるためあまり効率はよくなく,シグナル方式は制約があるためあまり使い勝手がよくない. というわけで新しく出てきたのがPOSIX Asynchronous I/O(AIO)という機構だ. これはIOのwaitをイベントドリブン形式にしてビジーループをなくそうというものだ. プログラムの流れとしては下記のようになる. 1. 対象となるファイルディスクリプタにシグナルハンドラもしくはイベントハンドラを登録しておく 2. aio_read/aio_writeを呼び出すと制御はすぐにユーザに戻る. 3.対象のファイルディスクリプタの処理が終わると登録されていたハン

    AsyncIOについて(その2) - 最速配信研究会(@yamaz)
  • AsyncIOについて(その1) - 最速配信研究会(@yamaz)

    最近のOSにはAsyncIO(AIO)という新しいI/Oの仕組みが導入されているようだ.lighttpdの次期バージョンではAIOを導入することで8割もパフォーマンスが上がったようで非常に興味深い. またあちこちのBlogを見る限りNonBlockingI/OやNonBlockingI/O+シグナルとAIOが混同されている気がしたので,それら整理してみたい. はじめに I/O処理であるシステムコールのread/writeは対象がディスクだったり,ソケットだったりデバイスだったりするわけだが,通常これらのIO処理はCPU処理やメモリ処理に比べ非常に遅いことが知られている. 通常readが行われるとreadが終わるまで,永遠に処理は戻ってこず,プロセス的には待ち状態になってしまう.これは「Blocking」と呼ばれる. 遅いディスクやデータがいつ来るかわからないソケットなどに対するIO処理では

    AsyncIOについて(その1) - 最速配信研究会(@yamaz)
  • libaio(Linuxの非同期I/Oライブラリ)の使い方 - moratorium

    libaio(Linuxの非同期I/Oライブラリ)の使い方 2007-06-05 (Tue) 4:53 Unix Linuxで非同期I/Oを行うためのライブラリ「libaio」の使い方を書いてみる事にする。少し昔の話になるが、lighttpdが使用し、スループットを80%も上げたらしい。 TOEFLに向けて転置ファイルについての論文(Inverted files for text search engine [moffat 06])でReading対策をしていたところ、意外とスニペット(検索にヒットした箇所の前後の文章)を作るところが時間がかかるという事を教えてもらったので、適当にそれを例題にしてみる。具体的には以下のようなコードを非同期I/Oを使用して速くなるかどうか見てみる。 for (unsigned int i = 0; i < files.size(); i++) { FILE*

    kamipo
    kamipo 2009/03/24
    非同期I/Oを使えばファイル分だけI/O要求を一気に出しておけば、それをI/O Schedulerが賢くスケジューリングし、全体としての読み込み時間をminimizeする事が出来る。
  • Linuxでaio - (ひ)メモ

    実装が2つある。以下、あくまで今の時点でのLinuxの場合の状況/実装のおはなし。 POSIX aio aio_read(3) とか aio_write(3), aio_error(3), aio_return(3) とか。 インターフェースはPOSIXで定義されているのと同じ。 システムコールじゃなくてライブラリ関数(librt) 裏でpthreadつくってがんばってるげ。 libaio http://lse.sourceforge.net/io/aio.html http://ftp.jaist.ac.jp/pub/Linux/Fedora/development/source/SRPMS/libaio-0.3.106-3.2.src.rpm とか io_prep_pread(2), io_prep_pwrite(2), io_submit(2), io_queue_init(2),

    Linuxでaio - (ひ)メモ
  • 非同期I/O Linux

    非同期I/O 概説 Introduction to Asynchronous I/O AIO, I/O Multiplexing… 2007年8月6日 KLab 株式会社 Kラボラトリー 廣瀬 正明 Copyright © KLab Inc. All rights reserved. 今日の目的 非同期I/Oとは何かを知る 非同期I/Oを使うと何がうれしいのかを知る 非同期I/Oを実現する手段(複数)を知る Copyright © KLab Inc. All rights reserved. アジェンダ 非同期I/Oを使う理由 非同期I/Oとは? AIOの実装を紹介 AIOの使い方 落穂ひろい Copyright © KLab Inc. All rights reserved. アジェンダ 非同期I/Oを使う理由 非同期I/Oとは? AIOの実装を紹介 AIOの使い方 落穂ひろ

  • マルチコア時代の高速サーバーの実装 - Blog by Sadayuki Furuhashi

    特にサーバー用途では、CPUがシングルコアに戻ってくることは考えにくい。 マルチコアCPUの性能を活かすにはマルチスレッドに対応したサーバーの実装が必要になるわけですが、マルチスレッドなプログラミングは往々にして「高負荷になると固まる」とか「たまに落ちる」といった悩ましいバグと戦わなければならず、イヤです。 かといってシングルスレッドでは、近い将来 32コアCPU! などが出てきたとき、たぶん性能を発揮できません。 そこで、そこそこデバッグしやすく、それでいて多コアCPUでもスケールするという落としどころを模索しているのですが、ボトルネックはネットワークIO周りにあるだろう*1という前提の元で、ネットワークIO部分だけをマルチスレッドで動かし、それ以外の部分をシングルスレッドで動かすというアーキテクチャを考えています。 ロジックの部分はマルチスレッドで書いても共有リソースにアクセスする度に

    マルチコア時代の高速サーバーの実装 - Blog by Sadayuki Furuhashi
  • 1