ぽよメモ

レガシーシステム考古学専攻

alias vim="nvim"した

動機

院試が終わったから積んでたタスクをこなしていきます.
かつてvim + NeoBundleで頑張っていた頃はどうにも重かったので最近はプラグイン類を敬遠していましたが,最近流行りのneovimはヌルヌルらしいと聞き前から試してみたいと思っていました.

環境

  • macOS Sierra 10.12.6
  • Homebrew 1.3.1
  • iTerm2 3.0.15
  • neovim v0.2.0
  • pyenv 1.1.0
  • python 2.7.13
  • python3 3.6.0

pyenvで作った環境のpythonを使用します.

今回のゴール

  1. neovimへ移行する
  2. dein.vimでtomlファイルによるプラグイン管理をする
  3. vim-airlineで見た目をかっこよく

neovimへ移行する

インストール

brewから叩くだけ.

$ brew tap neovim/neovim
$ brew install neovim

pyenvで仮想環境を作成します(pyenv-virtualenvを利用しています ).

$ pyenv install 2.7.13 3.6.0
$ pyenv virtualenv 2.7.13 neovim2
$ pyenv virtualenv 3.6.0 neovim3
$ pyenv global neovim2 neovim3
$ pyenv which python
/usr/local/var/pyenv/versions/neovim2/bin/python
$ pyenv which python3
/usr/local/var/pyenv/versions/neovim3/bin/python3

neovimの真価を発揮させるためにpython用ライブラリをインストールします.

$ pip install --upgrade neovim
$ pip3 install --upgrade neovim

neovimを起動し,:echo has("python3")して1が返ってきたらOK.

設定ファイルを作る

~/.config/nvim以下に設定ファイルを作るのが主流のようなのでそれに乗っかります.

$ vim ~/.bashrc
# 以下を追記
export XDG_CONFIG_HOME=/Users/<ユーザ名>/.config
export XDG_CACHE_HOME=/Users/<ユーザ名>/.cache

設定ファイルはinit.vimになります.

$ mkdir ~/.config/nvim
$ touch ~/.config/nvim/init.vim

aliasを張る

$ echo "alias vim='nvim'" >> ~/.bashrc

dein.vimプラグイン管理

暗黒美夢王ことShougo氏に感謝.

インストール

githubの通りです.

github.com

また,インストールディレクトリは主流に従って~/.cacheとします(.bashrcに追記したXDG_CACHE_HOMEになります).

$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.cache/dein

tomlでプラグイン管理

この状態ではまだdein.vimは読み込まれないのでinit.vimに設定を追記していきます.

" ============== dein =================
" Pythonインタプリタへのパスを指定
" Ubuntuでも使い回す予定なので分けています
if has("mac")
    let g:python3_host_prog = '/usr/local/var/pyenv/versions/neovim3/bin/python3'
    let g:python_host_prog = '/usr/local/var/pyenv/versions/neovim2/bin/python'
else
    let g:python3_host_prog = '/usr/bin/python3'
    let g:python_host_prog = '/usr/bin/python'
endif

" 各種ファイルへのパス
let s:dein_cache_dir = $XDG_CACHE_HOME . '/dein'
let s:dein_config_dir = $XDG_CONFIG_HOME . '/nvim'
let s:dein_repo_dir = s:dein_cache_dir . '/repos/github.com/Shougo/dein.vim'
let s:toml = s:dein_config_dir . '/dein.toml'
let s:toml_lazy = s:dein_config_dir . '/dein_lazy.toml'

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
let &runtimepath = s:dein_repo_dir .",". &runtimepath

" Required:
if dein#load_state(s:dein_cache_dir)
  call dein#begin(s:dein_cache_dir)

  " Let dein manage dein
  " Required:
  call dein#add(s:dein_repo_dir)
  
  " tomlファイルからプラグインのリストをロードしキャッシュする
  call dein#load_toml(s:toml, {'lazy': 0})
  call dein#load_toml(s:toml_lazy, {'lazy': 1})
  
  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

~/.config/nvim/dein.tomlに管理するプラグインを書いていきます.また,インサートモード時のみなどに遅延して読み込むようなプラグインdein_lazy.tomlに記述していくこととします.

まずdein.tomlから.colorschemeには比較的目に優しくtrue color対応していたtenderを使用しています.

[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]]
repo = 'Shougo/vimproc.vim'
hook_post_update = '''
    if dein#util#_is_windows()
        let cmd = 'tools\\update-dll-mingw'
    elseif dein#util#_is_cygwin()
        let cmd = 'make -f make_cygwin.mak'
    elseif executable('gmake')
        let cmd = 'gmake'
    else
        let cmd = 'make'
    endif
  let g:dein#plugin.build = cmd
'''

[[plugins]]
repo = 'jacoborus/tender.vim'

[[plugins]]
repo = 'scrooloose/nerdtree'
hook_add = '''
    nnoremap <silent><C-e> :<C-u>NERDTreeToggle<CR>
    let g:NERDTreeShowHidden = 1
'''

次にdein_lazy.toml.補完候補表示のためのエコシステムとしてこれまたShougo氏作のdeoplete.nvimを導入しています.

github.com

lexima.vimは対応する括弧の自動入力プラグインです.

[[plugins]]
repo = 'Shougo/deoplete.nvim'
on_i = 1
hook_source = '''
    let g:deoplete#enable_at_startup = 1
    let g:deoplete#enable_smart_case=1
    inoremap <expr><TAB> pumvisible() ? "\<C-N>" : "\<TAB>"
'''

[[plugins]]
repo = 'zchee/deoplete-jedi'
depends = ['deoplete.nvim']
on_ft = ['python']

[[plugins]]
repo = 'cohama/lexima.vim'
on_i = 1

on_i = 1でインサートモード時のみ起動と指定できるのがスマートで嬉しい. 次回起動時にプラグインが自動的にインストールされます.

vim-airlineでかっこよくする

colorshcemeでそれなりになるとはいえまだまだ真っ黒画面で味気ないので,実際に便利かはさておき気分的に盛り上がるプラグインを入れます.

github.com

dein.tomlに追記

[[plugins]]
repo = 'vim-airline/vim-airline'
depends = ['vim-airline-themes']
hook_add = '''   
    set laststatus=2
    let g:airline_theme = 'deus'
'''

[[plugins]]
repo = 'vim-airline/vim-airline-themes'

プラグインの導入が完了すると以下に近い見た目になると思います*1

f:id:pudding_info:20170903155926p:plain

悪くは無いけど,ちょっとダサい…他の人たちのairlineもっとかっこよくない????
というわけでvim-airlinehook_addを以下の様にします.

set laststatus=2
let g:airline_theme = 'deus'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_idx_mode = 1
let g:airline#extensions#virtualenv#enabled = 1

すると以下の様に文字化けが起きます(たぶん)

f:id:pudding_info:20170903160341p:plain

これはiTerm2のデフォルトのフォントがPowerline用の文字を含んでいないためで,セパレータ部分が化けてしまうようです.

文字化けを直す

フォントのインストール

Powerline用にフォントを合成しインストールするというのが一般的な手法で,Rictyがよく使われているようだと言うことが分かりました.
macで導入する方法はいくつかありますが,まずググって出てきた方法として

$ brew tap senemat/font
$ brew install ricty --with-powerline

を試してみましたが,常にSEGVで落ちるためうまく行きませんでした.brewでインストールされるfontforgeが良くないというようなことがエラーメッセージのリンク先のissueには書いてありましたが自力でインストールするのは面倒なのでパス,

ググっているとどうもすでにパッチが当てられたフォント*2が配布されている模様.mzyy94氏に感謝を捧げつつ使わせて頂きます.

github.com

$ git clone https://github.com/mzyy94/RictyDiminished-for-Powerline.git
$ cd RictyDiminished-for-Powerline/powerline-fontpatched
$ cp Ricty*.ttf ~/Library/Fonts/

powerline-fontpatchedディレクトリに入っているフォントのみで上手くいきました.最初はvim-powerline-fontpatchedに入っているフォントを使用したのですが,うまく行きませんでした*3

iTerm2に設定

インストールしただけではダメなのでiTerm2のフォント設定を行います.
Use a different font for non-ASCII textにチェックを入れ,先ほどインストールしたフォントを選択します.

f:id:pudding_info:20170903161642p:plain

これを適用すると以下の様になります*4

f:id:pudding_info:20170903161855p:plain

しかしまだズレています.右下の部分はセパレータが半角スペース一つ分くらいズレているのがわかります.

セパレータを上書き

この半角ズレがなかなか修正できず,半日ほどかかりました.
set ambiwidth=doubleすると良いということが書かれていた記事もありましたが,これを設定しても以下の様になりさらに崩れてしまったため,今はコメントアウトしています.

f:id:pudding_info:20170903162751p:plain

最終的に以下の様にセパレータ部分の文字を指定することで解決しました.

let g:airline_left_sep = '⮀'
let g:airline_left_alt_sep = '⮁'
let g:airline_right_sep = '⮂'
let g:airline_right_alt_sep = '⮃'

f:id:pudding_info:20170903162955p:plain

正直解決法がこれで合っているのか分かりません.何か原因が他にあり,この操作の副次的な作用で解決している可能性もあります.何か分かる方はコメント頂けると嬉しいです…

課題

  • vim-quickrunまだ導入できてない
  • denite.nvimもちゃんと導入したい
  • Ubuntuでの導入にまだ着手できてない
  • python仮想環境での扱い方(補完候補の表示など)

まとめ

設定値の全体は以下にあります.

github.com

マシン自体が高速になったせいもあるでしょうが,補完候補の表示やそもそもの起動速度などがかなり快適で,乗り換えた価値がありました.
Shougo氏には足向けて寝れません.

f:id:pudding_info:20170903232551p:plain

参考にしたサイト

*1:様々なカラースキームはここScreenshots · vim-airline/vim-airline Wiki · GitHubにあります

*2:RictyではなくRicty Diminished

*3:なぜなのかは分からないです.名前的にこっちかなぁと思ったのですが…

*4:少し縦方向にズレているなと感じた場合,先ほどのフォント選択画面からCharacter Spacing > Verticalの項目を少し大きくすることで解決します

転科,あるいは人生について

普段まともな記事を書いているのでこういうときくらいポエムを投稿しても良いのでは無いかと思った.

はじめに

大学院から思いっきり方向の違う専攻を選んで院試に合格したので記念ポエム.重要なことは書かない.その場で思いついたことを書いている.

生物学がしたかった

学部選択

高校時代楽しい授業が少なく生物だけは(おそらく先生のおかげが多分にあり*1)面白かったため,数学は散々だったが生物がやりたくて理系に進んだ.
大学も生物ができること,という軸で選んだため今の大学に来たが,個人的にはこの選択は悪くなかったと思っている.そんなに虫は好きじゃ無いけど.

当時は特に何も言われなかったが,大学であれこれやっているうちに「なんで情報に行かなかったのか」といったことを割とよく言われるようになった.おそらく当時やっていたこと*2のせいだとは思うのだが,僕としてはとても驚きに満ちた質問だった.
数学も物理もからっきしだった僕にとって,入試科目の主軸がその二科目である情報工学は最も遠いものであり,一度も検討すらしなかったからだ.

今の学科に欲を言い出せば切りは無いけれど,レベル的に自分はこんなもんだなという感じもあるし,授業内容は割と面白い.重複が多いので無駄かな?と思うことも多いけど. そういうわけで僕は今の大学,今の学部にそれなりに満足している.

大学院

満足はしているが別にこれでいいと思っているわけでは無い.

生物学はどちらかというと体育会系に近いと思う.手を動かしたもの,長く実験をこなしたものが偉いし,古い慣習に固執する人も多い*3.それを否定するわけではないし実際実験をするというのはとても大変なので割と正しい判断基準だとも思う.

が,それを大学院で追加で二年やりたいかと聞かれたときにズボラな僕としてはNoかなという気持ちになった.僕がやりたかったのは生物学であってピペットマンの扱い方の習熟ではなかったのだという気付きを得た瞬間である.

そこからはしばらく悩んだ.NAISTバイオインフォマティクスをやる道,はたまた全然違うところへ進む道.とにかくせっかく多少プログラミングというものに興味が出たのだからそれが活かせることをしたい,という軸で考えた.次にお金.今のラボの先生が応援してくれたのはとてもありがたかった.本当にありがとうございます.

結局お金の関係もあり弊学の情報工学専攻を選んだ.決め手は「行く先のラボの教授が楽しそう」*4

僕は生物学を”したかった”.今は次なる未知の世界を楽しみにしている.

合格した

自慢

C言語歴3,4ヶ月だけど院試受かった,わーい✌️

いぇーーーーい✌️

(o゚▽゚)

はい.

不安

院試には受かってしまったが兎にも角にも基礎がまるでなっていない自分であるので,院から上手くやっていける自信がこれっぽっちもない.
院試レベルの数学で悪戦苦闘するし,プログラミングもたかが知れている.

正直「頑張っていこう」と言う他ない.来年春に応用情報技術者試験を受けようかなと思っているので,少しずつ勉強進めていきたい*5

希望

新しいことを学べるというのはとても面白いので,この前の勉強会も色々な気付きがあったしまぁ楽しんではいけるだろうと思った.

これまでは互いに違う科目をやっていた同期と,今後は肩を並べて*6色々出来そうと言うのはなんとなくわくわくする.生物学科だから〜と言い逃れすることも出来なくなるが,あんまりいい加減なことばかりも言ってられないのでそろそろしゃっきりとすべきだろう.

あと水槽が置きたい.水槽.構成を妄想するのが一番楽しい.

最後に

大学院選択で相談に乗ってくださった方々,院試勉強でお世話になった方々,今のラボの先生方,来年度から世話になる先生,一緒に院試で苦しんだ学友たち,本当にお世話になりました.たぶん来年度からはより一層お世話になるのでよろしくお願いいたします.

身の回りで今の学科・学部が合わないような気がするという人が多い中で,学部も院も自分が楽しめそうな所を選べたことはとても幸運だったなと思う.同時に,そうやって苦しんでいる人たちもうまくすれば(これが難しいというのはあるが)どこかのタイミング*7で自分のやりたいことを選択することは出来る,絶望するにはまだ早いと思うので頑張って欲しい.

とりあえず頑張って学部卒業します.

*1:先生ありがとうございます.

*2:なかったことにしたい気もする

*3:これは個人の感想です

*4:たびたびランチの時間に失礼して申し訳ないです.来年からよろしくお願いいたします.

*5:卒論大丈夫か,という質問もよくもらうけど大丈夫なわけないです.

*6:並べられるのかという議論はここでは置いておく

*7:3年時編入・学部再受験・転科・大学院…etc

ZFSのdedup地獄から命からがら逃げ延びた話

はじめに

これはついうっかり大きなデータを書き込むようなZFSファイルシステムにおいてdedup=onしてしまった挙げ句,気付かないでガンガン運用してすでに数TB書き込んでしまったという全国のドジっ子メイドさんが一人でも救われれば良いなと思って書いています.ちなみに最初に言っておくと今回も前回と同様*1救いはないです.

環境

サーバー構成

  • CPU: Core i3-3220 3.3GHz
  • メモリ: DDR3 24GB
  • システムドライブ: SSD128GB
  • Ubuntu Server 16.04 LTS
  • ZFS on Linux
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
$ sudo zfs upgrade
This system is currently running ZFS filesystem version 5.

All filesystems are formatted with the current version.
$ modinfo zfs
filename:       /lib/modules/4.4.0-70-generic/kernel/zfs/zfs/zfs.ko
version:        0.6.5.6-0ubuntu15
license:        CDDL
author:         OpenZFS on Linux
description:    ZFS
srcversion:     D82FFDF4C1394A435E2B38A
depends:        spl,znvpair,zunicode,zcommon,zavl
vermagic:       4.4.0-70-generic SMP mod_unload modversions
...
$ cat /etc/modprobe.d/zfs.conf
options zfs zfs_arc_max=10737418240

zpoolの構成は以下

$ sudo zpool status
  pool: data
 state: ONLINE
  scan: resilvered 33.8M in 0h0m with 0 errors on Tue Jun 27 21:38:30 2017
config:

        NAME                                           STATE     READ WRITE CKSUM
        data                                           ONLINE       0     0     0
          raidz1-0                                     ONLINE       0     0     0
            ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0YZ2854   ONLINE       0     0     0
            usb-I-O_DATA_HDCL-UT_000277B591400351-0:0  ONLINE       0     0     0
            ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0534235   ONLINE       0     0     0

errors: No known data errors

ここから以下の様に領域を切っています.(救われた後の様子です)

$ sudo zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
data              1.66T  3.61T   139K  /data
data/tank         1.48T  3.61T  1.48T  /data/Nas
data/timemachine   167G   133G   167G  /data/timemachine

dedup=onに気付くまで

実はサーバを構築した当初からdedupというオプションは絶対onにしないようにしようと堅く心に誓っていました.少なくともそう思って構築して運用してきていたので,どうもファイル操作をするとサーバが不安定になるがこれはなぜだろう,メモリが足りない?でも1GBとかでも動かしている人はいるしなぁ…とずっと不思議に思っていました.

うちのサーバはprometheusでリソースの監視をしている*2のですが,数十GB単位のファイル削除を行ったり,ファイルを連続して数十GB書き込んでいくとloadの値がぐっと上がり,node-exporterのnode_cpuメトリクスを見るとiowaitの値が急激に上がり,メモリを食い潰し,大量のスワップが発生することが分かったのもつい最近のことです.監視始めて良かった.

救われる前のZFSの領域はdata/Nasとして領域を切って以下の用途で運用していました.

  • chinachuおよびmirakurunを使用した録画データの置き場
  • 写真のバックアップ
  • iTunes Mediaのバックアップ
  • Windowsのバックアップ

だいたい3TBぶんほど消費していました.

実はこの運用の仕方をし始めてからずっと以下の症状に悩まされていました.

  1. Windowsからの書き込み時に十数GBを超えた当たりから一気に速度が落ち,エラーが出て書き込みに失敗する
  2. 大量に書き込んだ後極端にsambaの共有領域が重くなり,開けない,検索が出来ない,などが頻発する
  3. 数十GB単位で削除すると同様にファイルが開けない,検索ができない,などが頻発する.

実際の所そんなに激しいデータの読み書きをすることは少なく,これまでもなんとなくで運用は出来ていました.が,残り領域が2TBを切ったあたりからどうもパフォーマンスが悪くなったような気がしてならず,重い腰を上げて調べ始めたのがこの春のことでした.

ARCに制限を加える

まず最初にわかったのはメモリがあまりにも大量に使用されることです.何の設定もしない状態ではARCキャッシュとして

搭載メモリーが 4G バイト未満のシステムでは、メモリーの 75%

搭載メモリーが 4G バイトを超えるシステムでは、physmem から 1G バイトを引いた値

が使用されることになっているようです*3
うちのサーバではprometheus以外にもMinecraftサーバやGitlabサーバなどそれなりにメモリを消費するアプリケーションが複数あり,メモリが逼迫されることでレスポンスが異常に悪くなっていました.

とりあえず重くなっても動作はしてくれるようにZFSのARCサイズに制限を加えることとしました.これは/etc/modprobe.d以下に適切に配置することによって可能です.

$ sudo bash - c 'echo "options zfs zfs_arc_max=10737418240" > /etc/modprobe.d/zfs.conf'
$ sudo reboot

これでとりあえず10GBまでしかARCとして消費されなくなりました.

が,結果的に消費メモリが減ったおかげで書き込みや削除はより頻繁にフリーズするようになりました.

ZFS以外の領域に書き込んでみる

システムドライブに書き込んでみたところ全く問題なし.SSDなので速いだけかなぁ,やっぱりHDDは遅いしダメだな,とか思っていました.

sambaの設定を見直す

とくに悪さをしていそうな所は無し.実は一番最初はここを疑っていましたが,macからscpコマンドなどを使って書き込んでも再現したので疑うのを辞めました.

ZFSのパラメータを疑う

このあたりからだんだんと「あれ…?もしかしてdedup=onになってたりする?そんな馬鹿な」という疑惑が持ち上がってきていました.

$ sudo zfs get dedup data
NAME  PROPERTY  VALUE          SOURCE
data  dedup     off            default

ほら大丈夫じゃん!とここで放置してしまったのが運の尽きでした.当初このオプションは全体に適用されると思っていたため,ここを調べれば分かるだろうと思っていました. しばらく悩んだある日,なんとなくでdata/Nasのオプションを調べたところビンゴでした.

$ sudo zfs get dedup data/Nas
NAME  PROPERTY  VALUE          SOURCE
data  dedup     on            default

dedup=offに出来ないか

絶対先人がいるだろうと思ってググったらやっぱりおられました.

d.ballade.jp

ZFSを運用する者が知っておくべきこと(障害対策) – 日曜研究室

FreeBSD:zfsが調子悪いです(´Д`;) | 猫鯖の部屋

とりあえず

  • zfs set dedup=off data/Nasしちゃいけない
  • zfs destroy data/Nasしちゃいけない

ということが分かりました.

頑張る

前回も新しいプールを作成してashift値を変更するとかそういう強引なことをしましたが,今回も強引に行きます.

  1. dedup=offな領域data/tankを切る(/data/tankにマウント)
  2. サーバ上にしかないなくなると困るデータを/data/tankrsyncでコピー
  3. data/Nasのマウントポイントを/data/Nas_oldに,data/tankのマウントポイントを/data/Nasに変更
  4. どうにかしてdata/Nasを消す

1. 新しい領域の作成

$ sudo zfs create data/tank
# 念のため
$ sudo zfs set dedup=off data/tank
$ df -h | grep data/tank
data/tank         1.9T  0  1.9T  0% /data/tank

2. データのコピー

バカみたいに時間がかかるのでscreenを使いましょう.また,普段使いに極力影響しないように帯域制限をかけて負荷を抑えています.
容量に余裕がない場合,データの取捨選択をするか,少しずつデータをコピーし,その都度dedup=onな領域から少しずつ削除すると良いと思います.

$ screen -S rsync
$ rsync -ahvP -bwlimit=2048 \
    --exclude="hoge" \
    --exclude="fuga" \
    --exclude="piyo" \
    /data/Nas/* /data/tank

3. マウントポイントの変更

この操作の前にこれらの領域を使用するアプリケーションを全て止めましょう.

# アンマウントする
$ sudo zfs umount data/Nas
$ sudo zfs umount data/tank
# マウントポイント変更
$ sudo zfs set mountpoint=/data/Nas_old data/Nas
$ sudo zfs set mountpoint=/data/Nas data/tank
# 再びマウント
$ sudo zfs mount -a

4. dedup=onな領域を削除

ここで「意外とdestroyでいけるんじゃないか?」と思い,実行.

$ screen -S del
$ sudo zfs destroy data/Nas

最初は順調にいっているように思いましたが,途中からサーバが完全に応答しなくなり,強制的に落とすとディスクを一枚ちゃんと認識しなくなって焦り,ひどい目にあいましたので皆さん絶対に辞めておきましょう

書き込み済みのデータが多すぎることが問題なので少しずつ消していくスクリプトを書きます.

$ vim delete.sh
#! /bin/bash

TOTAL_SIZE=0
TARGET_DIR=/data/Nas_old
LIMIT=2048
INTERVAL=120

find $TARGET_DIR -type f | while read FILE
do
  SIZE=`wc -c "$FILE" | awk '{print $1}'`
  TOTAL_SIZE=`expr $TOTAL_SIZE + $SIZE`
  echo "Found $FILE"
  echo -e "\tFile size: $SIZE"
  echo -e "\tTOTAL: $TOTAL_SIZE"
  echo -e -n "\tTry to delete $FILE ... "
  ionice -c 3 rm -f "$FILE" >& /dev/null 2>&1
  if [ $? -eq 0 ]; then
    echo "[SUCCESS]"
  else
    echo "[FAIL]"
  fi
  S=`expr $TOTAL_SIZE / 1048576`
  if [ $S -ge $LIMIT ]; then
    echo "TOTAL_SIZE is over than $LIMIT MB. Sleep $INTERVAL sec."
    sleep $INTERVAL
    TOTAL_SIZE=0
  fi
done

何も考えず10分ほどで書いたので保証はしません…
一応各ファイルのサイズを見て,2GB以上削除するごとに120秒スリープするようにしています.1ファイル当たりの容量が数十GBになっても120秒しかスリープしないので,大きなファイルがある場合もっと賢い処理をした方が良いかも知れません.

$ screen -r del
$ sudo ./delete.sh

何日かかかりましたがこれで全て削除出来ました.
最後にdestroyすれば完了です.

$ sudo zfs destroy data/Nas

ちゃんと完了しました.

まとめ

メモリ24GB程度でdedup=onにすることはもはや災害に等しいので皆さん絶対に辞めましょう.

脚注