�� ���E�̃J�[�\���L�[�ł��y�[�W�J�肪�ł��܂�(�A���u���E�U�ˑ�)
���� ���� ( FUJIWARA Katsunori )
�O�E�ŁA HPC ( High Performance Computing ) �n�V�X�e���̂��߂� Solaris �����t�@�C���V�X�e�������������̂��@�ɁA OpenSolaris ����ɎQ���B
�u����Mercurial Linux/Windows�Ή��v�A �u���̃R�[�h�̂ǂ�������?�\�R�[�h���r���[���U������40�̃��[���v�A �u�A�Z���u���œǂ݉����v���O�����̂������v �Ƃ��������Ђ̎��M��A �Z�p�n�E�F�u�}�̂ւ��L���̊�e�Ƃ��������Ƃ��B
�z�[���y�[�W�A�͂Ăȃ_�C�A���[�A Twitter���ŏ�M���B
�I���N���́uSun ZFS Storage Appliance�v������������C���^�[�l�b�g�̃N���E�h�E�T�[�r�X�ŁA 2011 �N��������Q�������B
�w�X�g���[�W�̎��O�����\���ɂł��Ȃ������x���Ƃ������Ƃ��āA �܂��͐��\���E�e�X�g�����{���₷�����ЊJ���̐V�X�g���[�W���̗p������j�����\���ꂽ�B
�l�b�g��ł́A �����̏�Q���������� ZFS �� Solaris �̖��ł��邩�̂悤�Ȍ��y�������邪�A ����͖{�����낤���H
�\���Ɋւ���L�q���������ł́A �X�g���[�W�T�[�o�P�䂠����A 1000��K�͂̃N���C�A���g���A�N�Z�X������̂Ǝv����B
�k�C���ɂ���4,000���b�N�K���̐Ύ�f�[�^�Z���^�[�̍ŏ��̃T�[�r�X�Ƃ��āA �`���` �u������̃N���E�h�v��{���J�n���܂����B �`���` �{���̃T�[�r�X�J�n�܂łɁuSun ZFS Storage 7320 Appliance�v �������@�̗p�E�ғ����܂����B �` �I���N���́uSun ZFS Storage Appliance�v��������C���^�[�l�b�g�̃N���E�h�E�T�[�r�X�̃X�g���[�W�Ƃ��ĉғ��J�n
�k�C���ɂ���4,000���b�N�K���̐Ύ�f�[�^�Z���^�[�̍ŏ��̃T�[�r�X�Ƃ��āA �`���` �u������̃N���E�h�v��{���J�n���܂����B
�`���` �{���̃T�[�r�X�J�n�܂łɁuSun ZFS Storage 7320 Appliance�v �������@�̗p�E�ғ����܂����B
�` �I���N���́uSun ZFS Storage Appliance�v��������C���^�[�l�b�g�̃N���E�h�E�T�[�r�X�̃X�g���[�W�Ƃ��ĉғ��J�n
IP over InfiniBand��TCP/IP���g����悤�ɂȂ��Ă���̂ŁA ���z�T�[�o����͕��ʂ�TCP/IP�Ńl�b�g���[�N�������܂��B �X�g���[�W�ɂ�NFS�Ń}�E���g���Ă��܂��B �` �u������̃N���E�h�v�̃A�[�L�e�N�`���́A�ӊO�ȂقǃV���v�������� �`
IP over InfiniBand��TCP/IP���g����悤�ɂȂ��Ă���̂ŁA ���z�T�[�o����͕��ʂ�TCP/IP�Ńl�b�g���[�N�������܂��B �X�g���[�W�ɂ�NFS�Ń}�E���g���Ă��܂��B
�` �u������̃N���E�h�v�̃A�[�L�e�N�`���́A�ӊO�ȂقǃV���v�������� �`
������̃N���E�h�̃X�g���[�W�̎�����NFS���g���Ă��āA �����QEMU��ʂ��āu/dev/sda�v�ȂǁA ���[�J���̃u���b�N�f�o�C�X�Ɍ����Ă����B �` ������̃N���E�h�AAmazon EC2�̔��z�ȉ���11���J�n�� �`
������̃N���E�h�̃X�g���[�W�̎�����NFS���g���Ă��āA �����QEMU��ʂ��āu/dev/sda�v�ȂǁA ���[�J���̃u���b�N�f�o�C�X�Ɍ����Ă����B
�` ������̃N���E�h�AAmazon EC2�̔��z�ȉ���11���J�n�� �`
�N���C�A���g�� 1000 ��K�͂ɂȂ�V�X�e���� NFS ?
�{�����ł́A 100 ��K�͂̃V�X�e���ł͖�薳���Ă��A 1000 �䒴�K�͂̃V�X�e���Ŗ��ƂȂ�ł��낤 Solaris NFS �����R���̖��ɂ��Đ�������B
�Ȃ��A �����̖��_�́A �wSolaris NFS �̎����������x�Ƃ��������A ���X�wNFS ���O��Ƃ��Ă���V�X�e�������������� 100 ��K�́x�Ƃ����A �O������s��v�̖��ƌ�����B
�ȉ��Amountd �ɂ����� MOUNT RPC �������̗���:
mnt(){ /* RPC �v���̃v���V�W���������ւ̐U�蕪�� */ mount(){ /* MOUNTPROC_MNT �����̎��{ */ findentry(path){ check_sharetab(); /* �t�@�C���X�V���̍ēǂݍ��݊Ǘ� */ /* sharetab ���e�̐��`���� */ } /* �ȉ��́w�A�N�Z�X���̋L�^�x�̏��� */ mntlist_new(host, path){ mntlist_insert(host, path){ if(!mntlist_contains(host, path)){ /* h_get() �ɂ���n�b�V���e�[�u������̈����������s */ rmtab_insert(); /* /etc/rmtab �ւ̒NjL */ h_put(); /* �n�b�V���e�[�u���ւ̊i�[ */ } } } } }
��K�̓V�X�e���ɂ����� mountd �ł̖��
�ȉ��̏����� export �Ώۃt�@�C���V�X�e���� N �ɑ��� O(N) �I�[�_�̐��`�����ƂȂ��Ă��܂��B
check_sharetab()(); /* �t�@�C���X�V���̍ēǂݍ��݊Ǘ� */�x �_�@�Ŏ��{����鏈�������`���� findentry(path) �ł̍��v�t�@�C���V�X�e���������Ă� �w/* sharetab ���e�����`���� */�x
findentry(path)
/* sharetab ���e�����`���� */
export �Ώۃt�@�C���V�X�e���̃o���G�[�V������ 100 �` 1000 �̃I�[�_�ɂȂ����ꍇ�A MOUNTPROC_MNT �v���ɂ�������`�����̃R�X�g�͖����ł��Ȃ��B
b130 ���O�̎����ł́A �ȉ��̏����ɂ�����n�b�V�����̒�`���s�K�Ȃ��߁A �����̃P�[�X�Ŏ������`�����ƂȂ��Ă��܂��B
h_get() �ɂ��n�b�V���e�[�u������̈�������
h_put(); /* �n�b�V���e�[�u���ւ̊i�[ */
b130 ���O�́whost + path�x�ɑ���n�b�V���l�Z�o������:
mntentry_has(){ for (i = 0, s = (uchar_t *)m->m_host; *s && i < HASH_MAXHOST; i++) { uchar_t ls = tolower(*s); sum <<= HASH_BITS; /* HASH_BITS(= 3)/SPACE �͏���r�b�g��ߖ� */ sum += ls - SPACE; *s++; } /* * The first character is usually '/'. * Start with the next character. */ for (i = 0, s = (uchar_t *)m->m_path+1; *s && i < HASH_MAXPATH; i++) { sum <<= HASH_BITS; sum += *s++ - SPACE; } return (sum); }
�ȉ��̏C���ɂ��A b130 �Ȍ�́whost + path�x�ɑ���n�b�V���l�Z�o�������ύX:
changeset: 11211:a6230133d60c user: Thomas Haynes <Thomas.Haynes@Sun.COM> date: Mon Nov 30 15:14:37 2009 -0600 summary: 6882460 Hundreds of NFSv3 client mounts followed by immediate reads causes timeouts
�R�~�b�g�������琄������ɁA ���̏C���� Solaris �̌��������[�X�Ɋ܂܂��̂́A �����Ă� Solaris10 update9 (2010/09 �����[�X) �Ȍ�ɂȂ锤�B
b130 �Ȍ�́whost + path�x�ɑ���n�b�V���l�Z�o������:
mntentry_str_hash(char *s, uint_t hash){ uint_t g; for (; *s != '\0'; s++) { hash = (hash << 4) + *s; if ((g = (hash & 0xf0000000)) != 0) { hash ^= (g >> 24); hash ^= g; } } return (hash); } mntentry_hash(){ uint_t hash = mntentry_str_hash(m->m_host, 0); return mntentry_str_hash(m->m_path, hash); }
��ʌ��ɑ���r�b�g����ɂ���āA �n�b�V���l�̏Փˉ\�����啝�ɒጸ����Ă���B
b130 �ł̏C���ɂ́A �wh_get() �ɂ��n�b�V���e�[�u������̈��������x���� �wh_put(); /* �n�b�V���e�[�u���ւ̊i�[ */�x�Ɏ��� �w�A�N�Z�X���̋L�^�x�����S�̂��A ��p�X���b�h�Ŕ��I�Ɏ��{����@�\�̒lj����܂܂�Ă��邽�߁A ��������\��ጸ�����Ă��锤�B
�n�b�V���l�Z�o���w�p�X���x�x�[�X�ł͂Ȃ��A ���J�Ώۃt�@�C���V�X�e���ɂ�����w���ʎq�x�x�[�X�Ȃ̂ŁA �Փ˂͂قږ����Ƒz��\�B
���������̈���ŁA �n�b�V���e�[�u���T�C�Y�� 32 (EXPTABLESIZE) �Œ�Ȃ̂ŁA ���L�Ώۃt�@�C���V�X�e���� 1000 �K�͂ɂȂ����ꍇ�A �n�b�V���G���g�����̃`�F�[������ 32 �ȏ�ƂȂ�_�́A ���\�Ɋւ��Ĉꖕ�̕s��������B
mountd �ɂ�����w����Ώ� FS �̃n���h���̈��������x �Ɠ����̏������s����B
���Ȃ݂ɁA mountd/nfsd ���ɁA ����Ώ� FS �̃n���h���̈������ď����́A �J�[�l���w�܂ō~��Ă��Ď��s�����B
���[�U��Ԃœ��삷�� mountd ����́A NFS ��p�V�X�e���R�[���ŃJ�[�l���w�ɗv�������s�����B
�ȉ��Anfsd �ɂ�����z�X�g���A�N�Z�X�ۂ̊m�F�����̗���:
common_dispatch(){ checkauth(){ nfsauth_access(){ nfsauth_cache_get(){ /* �N���C�A���g��IP�x�[�X�ŃA�N�Z�X�����n�b�V������������� */ /* �ȉ��A�L���b�V����ɃA�N�Z�X��Ȃ��ꍇ */ nfsauth_retrieve(){ �� DOOR IPC �ɂ�� mountd �Ƃ̘A�g �`{ nfsauth_func(){ nfsauth_access(){ findentry(); /* sharetab ���e�̐��`���� */ check_client(); /* �N���C�A���g�ꗗ�̐��`���� */ } } } �` DOOR IPC �ɂ�� mountd �Ƃ̘A�g �� } } } } }
��K�̓V�X�e���ɂ����� nfsd �ł̖��
�z�X�g���A�N�Z�X�ۂ̊m�F�ɂ����āA �ȉ��̏����� O(N) �I�[�_�̐��`�����ƂȂ��Ă��܂��B
findentry()
��x�������Ă����{����Ă��Ă��܂��A �Ȍ�͊e���L�Ώۃt�@�C���V�X�e�����ɁA IP�A�h���X�x�[�X�̃n�b�V���e�[�u���ŊǗ�����邽�߁A ���\�͔�r�I�ጸ����锤�B
�A���A �n�b�V���e�[�u���̃T�C�Y�� 32 �Œ�̂��߁A �N���C�A���g�� 1000 ��K�͂ɂȂ����ꍇ�A �n�b�V���G���g�����̃`�F�[������ 32 �ȏ�ƂȂ�_�ŁA ���\��̕s���͎c��B
���Ȃ݂ɁA nfsauth_cache_get() �ɂ�����A�N�Z�X�\�N���C�A���g�̏��L���b�V���̊Ǘ��́A �ȉ��̗v�̂Ŏ�������Ă��邽�߁A ����N���C�A���g���������A�N�Z�X�����������ꍇ�A �w�L���b�V���̒lj��x�ɂ����āA ������e�̃L���b�V�����d�����Ēlj������\��������B
�������A���ɏd���̌����^�r�����s���Ă��Ȃ��̂́A (1) �r���̕ێ����ŏ����ɂ��邽�߂ƁA (2) �]�v�Ȑ��`�����ɂ�鐫�\��������邽�߂Ǝv����B
�܂��A �L���b�V���̗L�����Ԃ� 600 �b�����A �L��������̍ۂ̍ēǂݍ��݂́A �ȉ��̗v�̂Ŏ��{����邽�߁A ��U�L���b�V�����ꂽ��̉������\�͂�����x�S�ۂ����B
������L���b�V���̊�������A �o�b�N�O�����h�Ŏ��{�����̂ŁA ���m�ɂ́w��U�L���b�V�����ꂽ��̉������\�͂�����x�S�ہx �Ƃ����̂͐������Ȃ��̂����A �ڍׂ̓\�[�X���Q�Ƃ̎��B
�v���đ�����́A ���s�ɂ�蕛��p�������̗v���̍ۂɁA �����ꂩ�̑w�ɂ�����đ����{�������ƂȂ��āA �z��O�̋����ƂȂ邱�Ƃ�h�����߂ɕK�v�B
�đ����{�́A OSI �Q�ƃ��f���Ō����Ƃ���� �w�A�v���P�[�V�����w�x�ɊY������ �wNFS �N���C�A���g�����x�ȊO�ł����{�����\��������B
���[�U��Ԃ��痘�p����ϓ_����́A �g�����X�|�[�g�w�Ƃ��� TCP/IP ��I�������ꍇ�A �w�����p�P�b�g�̏����x�͔������Ȃ��悤�Ɏv���邩������Ȃ����A �V�X�e���\�� �` �h���C�o�����ɂ���ẮA ����قǒ��������ۂł͂Ȃ��B
���Ȃ݂ɁASolaris NFS �����̏ꍇ�A TCP/IP �Ȃ� 60 �b�A UDP �Ȃ� 1.1 �b�̊Ԃɉ����������ꍇ�A ��U�ʐM�w���琧�䂪�߂�A NFS �w�哱�ōđ����s���悤�ɂȂ��Ă���B
UDP �ڑ��̂悤�Ƀ^�C���A�E�g���Ԃ����ɒZ���ꍇ�A ���חv���ɂ��T�[�o���ɂ����邿����Ƃ��������̒x�����A �đ��̎��{ �` ���ׂ̑��� �` �đ��̕p���̃��[�v�������Ă��܂��̂ŁA �\���Ȓ��ӂ��K�v�B
�t����v����2��ނɕ��ނ���:
�O�҂ɊY������v���ɂ́A IDENPOTENT �t���O�����Ă��Ă���B
static struct rpcdisp rfsdisptab_v3[] = { .... { rfs3_getattr, xdr_nfs_fh3_server, .... xdr_GETATTR3res, .... nullfree, (RPC_IDEMPOTENT | RPC_ALLOWANON), rfs3_getattr_getfh }, .... { rfs3_mkdir, xdr_MKDIR3args, .... xdr_MKDIR3res, .... nullfree, 0, rfs3_mkdir_getfh}, .... }
�v���đ��̌��o�͈ȉ��̃t���[�Ŏ��{�����B
common_dispatch(){ if(0 == (disp->disp_flas & RPC_IDEMPOTENT)){ /* �đ��������K�v�ȗv�� */ dupstat = SVC_DUP_EXT(....); /* �v���đ��̊m�F */ switch(dupstat){ case DUP_INPROGRESS: /* �ʃX���b�h�Ŏ��s�� */ /* �������Ȃ� */ goto done; case DUP_NEW: /* �đ����o���� */ /* ��Ԃ� DUP_INPROGRESS �ɂ��Ă��� */ (*disp->dis_proc)(args, res, exi, req, cr); /* �������{ */ SVC_DUPDONE_EXT( .... ); /* �đ��L���b�V���ւ̓o�^ */ break; case DUP_DONE: /* ���ɉ����ς݂̏��� �� �đ��L���b�V������擾�������e�ʼn��� */ break; } } }
SVC_DUP_EXT() �� SVC_DUPDONE_EXT() �̎����́A �e�g�����X�|�[�g�w���ɒ�`���ꂽ RPC �������W���[���ɂ����Ē�`����Ă���B
SVC_DUP_EXT()
SVC_DUPDONE_EXT()
�v���đ����ȉ��̂悤�Ɏ�������Ă��邽�߁A �đ��Ǘ��̏\�����Ɛ��\�ቺ�̊ԂŁA �o�����X�����Ȃ���Ȃ�Ȃ��B
NFS �̊e�v���V�W���������̎����ɂ����āA �N���C�A���g�z�X�g�^���L�Ώ� FS �̐��ɉe������̂́A ��ɔr�������p���ɂ�鐫�\�ւ̉e�����Ǝv����B
Solaris �� NFS �����́A �ȉ��̂悤�ɔ�r�I�z���̍s���͂��������ƂȂ��Ă��邽�߁A �{�����ł͂��̊ϓ_����͈���Ȃ����̂Ƃ���B
NFS �𗘗p����V�X�e���̏ꍇ�A NFS �N���C�A���g�������Ƃ̑g�ݍ��킹�ł��A �V�X�e���S�̂Ƃ��Ă̐��\�����E�����̂ŁA �� OS (or �� OS �كo�[�W����) ��g�ݍ��킹��ꍇ�͒��ӂ��K�v�B
�đ��L���b�V���ւ̓o�^�́A �đ��m�F���s�� SVC_DUP_EXT() �Ăяo�����_�Ŋm�ۂ����G���g���ւ̏���o���Ȃ̂ŁA ��K�̓V�X�e���ɂ�����^�p�̏ꍇ�ł��A ��{�I�ɃR�X�g�ቺ�v���͂Ȃ��B
�Ⴆ�Έȉ��̊��ɂ����āA host + path �� 32 �o�C�g���x�̕������r���A 1024 �̊e���X�g�v�f�ɑ��Ď��{�����ꍇ�A 1����������̏��v���Ԃ� 0.1 �~���b�ɋy�Ȃ����x�ł������B
�P���ȎQ�Ƃł���A �n�b�V���e�[�u���������I�ɍ\�z����Ă��Ȃ��Ă��A �\���Ȑ��\���o�锤(�v�L���b�V��������)�B
�{�����Ő��\�v���̉\�����w�E���Ă����ӏ��̑������A �Q�Ǝ��̓n�b�V���e�[�u���S�̂� READ �r�����A ���ώ�(�v�f�lj��^�폜��)�� WRITE �r�����l����������ƂȂ��Ă��邽�߁A �ȉ��̂悤�Ȑ��\�̉\�����l������B
�ȏ�̎��܂����ꍇ:
1000 �䒴�̑�K�̓V�X�e���ɂ����� NFS ���g�p����ꍇ�A Solaris NFS �����̎��_�Ō����Ă��钍�ӓ_�͈ȉ��̒ʂ�B