决定彻底放弃对MooseFS的研究
虽然对 分布式 也有一些了解,但是一直没有深入到代码去 研究 具体的实现。在群里咨询了一下,自己也google了一些资料,最终 决定 从MooseFS入手来深入 研究 分布式 系统 。第一步,就是从网上找文档,自己动手安装部署一番。官方网站上有一个中文的安装手册
虽然对分布式也有一些了解,但是一直没有深入到代码去研究具体的实现。在群里咨询了一下,自己也google了一些资料,最终决定从MooseFS入手来深入研究分布式系统。第一步,就是从网上找文档,自己动手安装部署一番。官方网站上有一个中文的安装手册,非常nice,整个安装配置过程也非常顺利,感觉还不错,就是看它的代码实现。看完之后有些失望,在main函数中的第一个函数strerr_init()中看到了这样的代码:
for (n=0 ; errtab[n].str ; n++) {}
static errent errtab[] = { #ifdef E2BIG {E2BIG,"E2BIG (Argument list too long)"}, #endif #ifdef EACCES {EACCES,"EACCES (Permission denied)"}, #endif ...... {0,NULL} };
另一个地方让我感觉作者在写代码的时候很不用心,cfg_reload()在解析配置文件时定义了一个缓冲区linebuff[1000]数组来存储每行读取的内容。mfs解析配置文件时是按行读取的,每行的配置内容类似“key=value"这样的形式。这个缓冲区的长度定义为1000,也让我很不解。因为在定义缓冲区或分配内存的时候,一般都会考虑到对齐,都会对齐到word size或者CPU cache line的长度。这里的1000让我很不解!
代码中还有很多无用的、多余的判断。例如下面的代码段:
logappname = cfg_getstr("SYSLOG_IDENT",STR(APPNAME)); if (rundaemon) { if (logappname[0]) { openlog(logappname, LOG_PID | LOG_NDELAY , LOG_DAEMON); } else { openlog(STR(APPNAME), LOG_PID | LOG_NDELAY , LOG_DAEMON); } }
判断仅一个空行之隔,没必要到极点了吧。
抛开这些细节性的东西不提,mfs选择的I/O复用机制也让人不敢恭维。现在需要监听套接字的读写事件,毫无疑问首选的eventpoll。如果没有记错的话,moosefs是07年开始的,这个时候内核中的eventpoll机制已经很完善了,实在不懂作者为什么要选用poll()来作为I/O复用的接口。在继续之前,先看一下下面的代码:
i = poll(pdesc,ndesc,50); ...... if (i 我不明白在poll()返回-1时,为什么要检查EAGAIN错误。查看了man手册,只有EFAULT、EINTR、EINVAL、ENOMEM错误,看了一下内核代码,也没有返回EAGAIN错误的地方。而且很不明白,为什么在EAGAIN的时候要调用usleep()等待100毫秒,不理解! <p> 最终<strong>彻底</strong>击穿我的信心的是matoclserv_gotpacket()函数,这个函数通过判断eptr->registered的值来做不同的三种处理,这三个代码块中很多都是可以合并的。要么给每种处理封装成一个函数,要么将这三块代码合并成一块,这样看着不是更简洁么?很多switch-case分支中的处理也不用区分eptr->registered的值,为什么写的这么庞大?难道作者在写的时候为了方便,复制粘贴了一番?反正我是很不理解,这样的代码风格真是让我没办法看下去,我<strong>决定</strong><strong>放弃</strong>了。我知道半途而废很不好,本来自己写代码风格就不好,怕看完之后更偏了,所以果断<strong>放弃</strong>!</p> <p> 下面是matoclserv_gotpacket()函数的代码,大家欣赏一下:</p> <p></p><pre name="code" class="cpp">void matoclserv_gotpacket(matoclserventry *eptr,uint32_t type,const uint8_t *data,uint32_t length) { if (type==ANTOAN_NOP) { return; } if (eptr->registered==0) { // unregistered clients - beware that in this context sesdata is NULL switch (type) { case CLTOMA_FUSE_REGISTER: matoclserv_fuse_register(eptr,data,length); break; case CLTOMA_CSERV_LIST: matoclserv_cserv_list(eptr,data,length); break; case CLTOMA_SESSION_LIST: matoclserv_session_list(eptr,data,length); break; case CLTOAN_CHART: matoclserv_chart(eptr,data,length); break; case CLTOAN_CHART_DATA: matoclserv_chart_data(eptr,data,length); break; case CLTOMA_INFO: matoclserv_info(eptr,data,length); break; case CLTOMA_FSTEST_INFO: matoclserv_fstest_info(eptr,data,length); break; case CLTOMA_CHUNKSTEST_INFO: matoclserv_chunkstest_info(eptr,data,length); break; case CLTOMA_CHUNKS_MATRIX: matoclserv_chunks_matrix(eptr,data,length); break; case CLTOMA_QUOTA_INFO: matoclserv_quota_info(eptr,data,length); break; case CLTOMA_EXPORTS_INFO: matoclserv_exports_info(eptr,data,length); break; case CLTOMA_MLOG_LIST: matoclserv_mlog_list(eptr,data,length); break; default: syslog(LOG_NOTICE,"main master server module: got unknown message from unregistered (type:%"PRIu32")",type); eptr->mode=KILL; } } else if (eptr->registeredsesdata==NULL) { syslog(LOG_ERR,"registered connection without sesdata !!!"); eptr->mode=KILL; return; } switch (type) { case CLTOMA_FUSE_REGISTER: matoclserv_fuse_register(eptr,data,length); break; case CLTOMA_FUSE_RESERVED_INODES: matoclserv_fuse_reserved_inodes(eptr,data,length); break; case CLTOMA_FUSE_STATFS: matoclserv_fuse_statfs(eptr,data,length); break; case CLTOMA_FUSE_ACCESS: matoclserv_fuse_access(eptr,data,length); break; case CLTOMA_FUSE_LOOKUP: matoclserv_fuse_lookup(eptr,data,length); break; case CLTOMA_FUSE_GETATTR: matoclserv_fuse_getattr(eptr,data,length); break; case CLTOMA_FUSE_SETATTR: matoclserv_fuse_setattr(eptr,data,length); break; case CLTOMA_FUSE_READLINK: matoclserv_fuse_readlink(eptr,data,length); break; case CLTOMA_FUSE_SYMLINK: matoclserv_fuse_symlink(eptr,data,length); break; case CLTOMA_FUSE_MKNOD: matoclserv_fuse_mknod(eptr,data,length); break; case CLTOMA_FUSE_MKDIR: matoclserv_fuse_mkdir(eptr,data,length); break; case CLTOMA_FUSE_UNLINK: matoclserv_fuse_unlink(eptr,data,length); break; case CLTOMA_FUSE_RMDIR: matoclserv_fuse_rmdir(eptr,data,length); break; case CLTOMA_FUSE_RENAME: matoclserv_fuse_rename(eptr,data,length); break; case CLTOMA_FUSE_LINK: matoclserv_fuse_link(eptr,data,length); break; case CLTOMA_FUSE_GETDIR: matoclserv_fuse_getdir(eptr,data,length); break; /* CACHENOTIFY case CLTOMA_FUSE_DIR_REMOVED: matoclserv_fuse_dir_removed(eptr,data,length); break; */ case CLTOMA_FUSE_OPEN: matoclserv_fuse_open(eptr,data,length); break; case CLTOMA_FUSE_READ_CHUNK: matoclserv_fuse_read_chunk(eptr,data,length); break; case CLTOMA_FUSE_WRITE_CHUNK: matoclserv_fuse_write_chunk(eptr,data,length); break; case CLTOMA_FUSE_WRITE_CHUNK_END: matoclserv_fuse_write_chunk_end(eptr,data,length); break; // fuse - meta case CLTOMA_FUSE_GETTRASH: matoclserv_fuse_gettrash(eptr,data,length); break; case CLTOMA_FUSE_GETDETACHEDATTR: matoclserv_fuse_getdetachedattr(eptr,data,length); break; case CLTOMA_FUSE_GETTRASHPATH: matoclserv_fuse_gettrashpath(eptr,data,length); break; case CLTOMA_FUSE_SETTRASHPATH: matoclserv_fuse_settrashpath(eptr,data,length); break; case CLTOMA_FUSE_UNDEL: matoclserv_fuse_undel(eptr,data,length); break; case CLTOMA_FUSE_PURGE: matoclserv_fuse_purge(eptr,data,length); break; case CLTOMA_FUSE_GETRESERVED: matoclserv_fuse_getreserved(eptr,data,length); break; case CLTOMA_FUSE_CHECK: matoclserv_fuse_check(eptr,data,length); break; case CLTOMA_FUSE_GETTRASHTIME: matoclserv_fuse_gettrashtime(eptr,data,length); break; case CLTOMA_FUSE_SETTRASHTIME: matoclserv_fuse_settrashtime(eptr,data,length); break; case CLTOMA_FUSE_GETGOAL: matoclserv_fuse_getgoal(eptr,data,length); break; case CLTOMA_FUSE_SETGOAL: matoclserv_fuse_setgoal(eptr,data,length); break; case CLTOMA_FUSE_APPEND: matoclserv_fuse_append(eptr,data,length); break; case CLTOMA_FUSE_GETDIRSTATS: matoclserv_fuse_getdirstats_old(eptr,data,length); break; case CLTOMA_FUSE_TRUNCATE: matoclserv_fuse_truncate(eptr,data,length); break; case CLTOMA_FUSE_REPAIR: matoclserv_fuse_repair(eptr,data,length); break; case CLTOMA_FUSE_SNAPSHOT: matoclserv_fuse_snapshot(eptr,data,length); break; case CLTOMA_FUSE_GETEATTR: matoclserv_fuse_geteattr(eptr,data,length); break; case CLTOMA_FUSE_SETEATTR: matoclserv_fuse_seteattr(eptr,data,length); break; /* do not use in version before 1.7.x */ case CLTOMA_FUSE_QUOTACONTROL: matoclserv_fuse_quotacontrol(eptr,data,length); break; /* for tools - also should be available for registered clients */ case CLTOMA_CSERV_LIST: matoclserv_cserv_list(eptr,data,length); break; case CLTOMA_SESSION_LIST: matoclserv_session_list(eptr,data,length); break; case CLTOAN_CHART: matoclserv_chart(eptr,data,length); break; case CLTOAN_CHART_DATA: matoclserv_chart_data(eptr,data,length); break; case CLTOMA_INFO: matoclserv_info(eptr,data,length); break; case CLTOMA_FSTEST_INFO: matoclserv_fstest_info(eptr,data,length); break; case CLTOMA_CHUNKSTEST_INFO: matoclserv_chunkstest_info(eptr,data,length); break; case CLTOMA_CHUNKS_MATRIX: matoclserv_chunks_matrix(eptr,data,length); break; case CLTOMA_QUOTA_INFO: matoclserv_quota_info(eptr,data,length); break; case CLTOMA_EXPORTS_INFO: matoclserv_exports_info(eptr,data,length); break; case CLTOMA_MLOG_LIST: matoclserv_mlog_list(eptr,data,length); break; default: syslog(LOG_NOTICE,"main master server module: got unknown message from mfsmount (type:%"PRIu32")",type); eptr->mode=KILL; } } else { // old mfstools if (eptr->sesdata==NULL) { syslog(LOG_ERR,"registered connection (tools) without sesdata !!!"); eptr->mode=KILL; return; } switch (type) { // extra (external tools) case CLTOMA_FUSE_REGISTER: matoclserv_fuse_register(eptr,data,length); break; case CLTOMA_FUSE_READ_CHUNK: // used in mfsfileinfo matoclserv_fuse_read_chunk(eptr,data,length); break; case CLTOMA_FUSE_CHECK: matoclserv_fuse_check(eptr,data,length); break; case CLTOMA_FUSE_GETTRASHTIME: matoclserv_fuse_gettrashtime(eptr,data,length); break; case CLTOMA_FUSE_SETTRASHTIME: matoclserv_fuse_settrashtime(eptr,data,length); break; case CLTOMA_FUSE_GETGOAL: matoclserv_fuse_getgoal(eptr,data,length); break; case CLTOMA_FUSE_SETGOAL: matoclserv_fuse_setgoal(eptr,data,length); break; case CLTOMA_FUSE_APPEND: matoclserv_fuse_append(eptr,data,length); break; case CLTOMA_FUSE_GETDIRSTATS: matoclserv_fuse_getdirstats(eptr,data,length); break; case CLTOMA_FUSE_TRUNCATE: matoclserv_fuse_truncate(eptr,data,length); break; case CLTOMA_FUSE_REPAIR: matoclserv_fuse_repair(eptr,data,length); break; case CLTOMA_FUSE_SNAPSHOT: matoclserv_fuse_snapshot(eptr,data,length); break; case CLTOMA_FUSE_GETEATTR: matoclserv_fuse_geteattr(eptr,data,length); break; case CLTOMA_FUSE_SETEATTR: matoclserv_fuse_seteattr(eptr,data,length); break; /* do not use in version before 1.7.x */ case CLTOMA_FUSE_QUOTACONTROL: matoclserv_fuse_quotacontrol(eptr,data,length); break; /* ------ */ default: syslog(LOG_NOTICE,"main master server module: got unknown message from mfstools (type:%"PRIu32")",type); eptr->mode=KILL; } } }

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

대규모 언어 모델(LLM)은 자연어 이해, 언어 생성, 복잡한 추론을 비롯한 여러 중요한 작업에서 강력한 기능을 입증했으며 사회에 지대한 영향을 미쳤습니다. 그러나 이러한 뛰어난 기능을 사용하려면 상당한 교육 리소스(왼쪽 참조)와 긴 추론 시간(오른쪽 참조)이 필요합니다. 따라서 연구자들은 효율성 문제를 해결하기 위한 효과적인 기술적 수단을 개발해야 합니다. 또한 그림의 오른쪽에서 볼 수 있듯이 Mistral-7B와 같은 일부 효율적인 LLM(LanguageModel)이 LLM의 설계 및 배포에 성공적으로 사용되었습니다. 이러한 효율적인 LLM은 LLaMA1-33B와 유사한 정확도를 유지하면서 추론 메모리를 크게 줄일 수 있습니다.

Windows.old 폴더는 Windows 10 업데이트 이전 운영 체제 버전에서 생성된 폴더입니다. 이 폴더에는 오래된 Windows 설치 파일, 프로그램 파일, 개인 파일이 포함되어 있으며 많은 디스크 공간을 차지합니다. Windows 10 업데이트를 사용한 후 일정 기간 동안 이전 운영 체제 버전으로 롤백하지 않을 것이라고 확인한 경우 Windows.old 폴더를 완전히 삭제하는 것이 좋습니다. 선택할 수 있는 몇 가지 방법은 다음과 같습니다.

3nm 공정, H100을 능가하는 성능! 최근 외신 디지타임스는 엔비디아가 차세대 GPU인 B100(코드명 '블랙웰')을 인공지능(AI)과 고성능컴퓨팅(HPC) 애플리케이션용 제품으로 개발 중이라는 소식을 전했다. B100은 TSMC의 3nm 공정 공정과 더욱 복잡한 MCM(멀티 칩 모듈) 설계를 사용하며 2024년 4분기에 출시될 예정입니다. 인공지능 GPU 시장의 80% 이상을 독점하고 있는 엔비디아의 경우, B100을 이용해 철이 뜨거울 때 공격할 수 있고, 이번 AI 배치 물결에서 AMD, 인텔 등 도전자들을 더욱 공격할 수 있다. NVIDIA 추정에 따르면, 2027년까지 이 분야의 출력 가치는 대략적으로 도달할 것으로 예상됩니다.

Redis를 사용하여 분산 데이터 동기화를 달성하는 방법 인터넷 기술의 발전과 점점 더 복잡해지는 애플리케이션 시나리오로 인해 분산 시스템의 개념이 점점 더 널리 채택되고 있습니다. 분산 시스템에서는 데이터 동기화가 중요한 문제입니다. 고성능 인메모리 데이터베이스인 Redis는 데이터를 저장하는 데 사용될 수 있을 뿐만 아니라 분산된 데이터 동기화를 달성하는 데에도 사용할 수 있습니다. 분산 데이터 동기화에는 일반적으로 게시/구독(Publish/Subscribe) 모드와 마스터-슬레이브 복제(Master-slave)의 두 가지 공통 모드가 있습니다.

EfficientSAM의 이 작업은 CVPR2024에 5/5/5점 만점으로 포함되었습니다! 작가는 그 결과를 아래 사진처럼 소셜미디어에 공유했습니다. 르쿤 튜링상 수상자도 이 작품을 강력 추천했습니다! 최근 연구에서 Meta 연구진은 SAM을 사용한 SAMI(Mask Image Pre-training)라는 새로운 개선된 방법을 제안했습니다. 이 방법은 MAE 사전 훈련 기술과 SAM 모델을 결합하여 고품질 사전 훈련된 ViT 인코더를 달성합니다. SAMI를 통해 연구자들은 모델의 성능과 효율성을 개선하고 비전 작업을 위한 더 나은 솔루션을 제공하려고 노력합니다. 이 방법의 제안은 컴퓨터 비전 및 딥 러닝 분야를 더욱 탐구하고 개발할 수 있는 새로운 아이디어와 기회를 제공합니다. 서로 다른 것을 결합하여

이미지-비디오 생성(I2V) 작업은 정적 이미지를 동적 비디오로 변환하는 것을 목표로 하는 컴퓨터 비전 분야의 과제입니다. 이 작업의 어려움은 이미지 콘텐츠의 신뢰성과 시각적 일관성을 유지하면서 단일 이미지에서 시간 차원의 동적 정보를 추출하고 생성하는 것입니다. 기존 I2V 방법에는 이 목표를 달성하기 위해 복잡한 모델 아키텍처와 많은 양의 교육 데이터가 필요한 경우가 많습니다. 최근 Kuaishou가 주도한 새로운 연구 결과 "I2V-Adapter: AGeneralImage-to-VideoAdapter for VideoDiffusionModels"가 발표되었습니다. 본 연구에서는 혁신적인 이미지-비디오 변환 방법을 소개하고 경량 어댑터 모듈을 제안합니다.

영상 생성이 본격화되고 있으며, 피카는 위대한 장군, 즉 피카의 창립 과학자인 구글 연구원 오메르 바르탈(Omer Bar-Tal)을 맞이했습니다. 한 달 전, 구글이 영상 생성 모델인 뤼미에르(Lumiere)를 공동저자로 출시했는데, 그 효과는 놀라웠다. 당시 네티즌들은 “구글이 영상 세대 전쟁에 합류했는데, 또 한 번 볼만한 좋은 쇼가 있다”고 말했다. StabilityAI CEO와 Google의 전 동료들을 포함하여 업계 관계자들이 축복을 보냈습니다. 뤼미에르의 첫 작품, 막 석사 학위를 취득한 오메르 바르탈(Omer Bar-Tal)은 2021년 텔아비브 대학교 수학과 컴퓨터과학과를 졸업한 뒤 와이즈만 과학원에서 컴퓨터 석사 과정을 공부했다. 주로 이미지 및 비디오 합성 분야의 연구에 중점을 두고 있습니다. 그의 논문 결과는 여러 차례 발표되었습니다

대규모 모델은 언어와 시각 사이를 도약하고 있으며 텍스트와 이미지 콘텐츠를 원활하게 이해하고 생성할 것을 약속합니다. 일련의 최근 연구에서 다중 모드 기능 통합은 증가하는 추세일 뿐만 아니라 이미 다중 모드 대화에서 콘텐츠 생성 도구에 이르기까지 주요 발전을 가져왔습니다. 대규모 언어 모델은 텍스트 이해 및 생성 분야에서 비교할 수 없는 기능을 보여주었습니다. 그러나 일관된 텍스트 내러티브를 사용하여 이미지를 동시에 생성하는 것은 여전히 개발되어야 할 영역입니다. 최근 캘리포니아 대학교 산타크루즈(Santa Cruz) 연구팀은 "생성 바우처" 개념을 기반으로 한 혁신적인 인터리빙 알고리즘인 MiniGPT-5를 제안했습니다. 언어 생성 기술. 논문 주소: https://browse.arxiv.org/p
