Acquire
cannot move anything up beyond an acquire
Release
cannot move anything down beyond a release
Note
acquire/release cannot be reordered with respect to each other
What does this mean?
instructions can be reordered from before an acquire to after an acquire
instructions can be reordered from after a release to before a release
acquire cannot be reordered before or after a release
release cannot be reordered before or after an acquire
std::atomic
read = load_acquire --> read the value == acquire the value
write = store_release --> write the value == release the value
Sequential Consistency
Transitivity / Causality
Total Store Order
This blog serves as a dumping ground for my own interests. On it you will find anything which I want to keep track of; links, articles, tips and tricks. Mostly it focuses on C++, Javascript and HTML, linux and performance.
Wednesday, 23 October 2013
using /proc/irq/#/smp_affinity to shield cpus from IRQs
IRQs (interrupt requests) are a request for service at a hardware level from the kernel.
When an IRQ arrives the kernel switches to interrupt context and loads the ISR (interrupt service routine) for the IRQ number which will process the interrupt.
IRQs have an affinity mask which defines which CPUs the ISR can run on. This is defined in /proc/irq/#/smp_affinity
The irqbalance service distributes IRQs across the processors in their associated affinity masks on a multiprocessor system. It uses /proc/irq/#/smp_affinity if it exists, or otherwise falls back to /proc/irq/default_smp_affinity/
The affinity mask in /proc/irq/#/smp_affinity and /proc/irq/default_smp_affinity is a 32-bit hex bitmask of CPUs.
eg: ffffffff means all 32 CPUs 0-31
If there are more than 32 cores, we build up multiple comma separated 32-bit hex masks.
eg: ffffffff,00000000 means CPUs 32-63
The irqbalance service uses the environment variable IRQBALANCE_BANNED_CPUS to tell it which CPUs it can't use for ISRs and IRQBALANCE_BANNED_INTERRUPTS to tell it which IRQs to ignore,
IRQBALANCE_BANNED_CPUS follows the same comma separated 32-bit hex format as /proc/irq/#/smp_affinity
IRQBALANCE_BANNED_INTERRUPTS is a space separated list of integer IRQs.
We can shield some CPUs from being interrupted in order to dedicate them to our own tasks.
We can also pin a network data consuming process onto a certain CPU and set the associated NIC (network interface controller) IRQs affinity mask to the same CPU so that they can share cache lines.
When an IRQ arrives the kernel switches to interrupt context and loads the ISR (interrupt service routine) for the IRQ number which will process the interrupt.
IRQs have an affinity mask which defines which CPUs the ISR can run on. This is defined in /proc/irq/#/smp_affinity
The irqbalance service distributes IRQs across the processors in their associated affinity masks on a multiprocessor system. It uses /proc/irq/#/smp_affinity if it exists, or otherwise falls back to /proc/irq/default_smp_affinity/
The affinity mask in /proc/irq/#/smp_affinity and /proc/irq/default_smp_affinity is a 32-bit hex bitmask of CPUs.
eg: ffffffff means all 32 CPUs 0-31
If there are more than 32 cores, we build up multiple comma separated 32-bit hex masks.
eg: ffffffff,00000000 means CPUs 32-63
The irqbalance service uses the environment variable IRQBALANCE_BANNED_CPUS to tell it which CPUs it can't use for ISRs and IRQBALANCE_BANNED_INTERRUPTS to tell it which IRQs to ignore,
IRQBALANCE_BANNED_CPUS follows the same comma separated 32-bit hex format as /proc/irq/#/smp_affinity
IRQBALANCE_BANNED_INTERRUPTS is a space separated list of integer IRQs.
We can shield some CPUs from being interrupted in order to dedicate them to our own tasks.
We can also pin a network data consuming process onto a certain CPU and set the associated NIC (network interface controller) IRQs affinity mask to the same CPU so that they can share cache lines.
Monday, 21 October 2013
Create angular app and express server / mongodb with yeoman
install (or update) yeoman
npm install -g yo
install (or update) yeoman angular fullstack generator (angular frontend / express server)
npm install -g generator-angular-fullstack
create angular app
yo angular-fullstack [name] // creates ng-app="nameApp", if blank uses curdir
npm install -g yo
npm update -g yo
npm install -g generator-angular-fullstack
npm update -g generator-angular-fullstack
yo angular-fullstack [name] // creates ng-app="nameApp", if blank uses curdir
I chose yes to add bootstrap, no for scss authoring, angular-resource (ngResource) and angular-route (ngRoute) and yes for mongoose/mongodb
add angular-bootstrap (angular directives for twitter bootstrap)
bower install angular-bootstrap --save
Github page for the angular-fullstack generator here:
bower install angular-bootstrap --save
run karma tests
grunt karma
get rid of the missing file warning by commenting out the following line from the files array:
'test/mock/**/*.js',
grab phantom.js for headless testing
http://phantomjs.org/download.html
configure karma to run Phantom.js instead of Chrome to
in karma.conf.js change browsers array to PhantomJS
run karma tests again to validate there are no warnings, and we're running through Phantom.js
grunt karma
serve angular app
grunt servergrunt karma
get rid of the missing file warning by commenting out the following line from the files array:
'test/mock/**/*.js',
grab phantom.js for headless testing
http://phantomjs.org/download.html
configure karma to run Phantom.js instead of Chrome to
in karma.conf.js change browsers array to PhantomJS
run karma tests again to validate there are no warnings, and we're running through Phantom.js
grunt karma
serve angular app
Github page for the angular-fullstack generator here:
Wednesday, 16 October 2013
MongoDb on Fedora 19
Install and start server
yum install mongodb-server
systemctl start mongod
systemctl enable mongod
systemctl status mongod
yum install mongodb-server
systemctl start mongod
Install client and verify it can connect to the server
yum install mongodb
mongo
You should now be in the mongo shell - test you can save and retrieve an object
db.test.save( { a: 1 } )
db.test.find()
Should display something like this:
{ "_id" : ObjectId("525f2fb01ec8e4af43c529c0"), "a" : 1 }
Thursday, 3 October 2013
hello world app with node.js and express.js
requires node and express to be installed (see here for instructions)
go to the root directory where your hello world app will be created
$ cd ~/src/web
create an express app called 'helloWorld' (and use the less css tool)
$ express helloWorld -c less
obtain the required dependencies and install
go to the root directory where your hello world app will be created
$ cd ~/src/web
create an express app called 'helloWorld' (and use the less css tool)
$ express helloWorld -c less
obtain the required dependencies and install
$ cd helloWorld
$ npm install
run the server
$ npm start # npm calls 'node app'
add nodemon to our devDependencies so the server gets restarted automatically during development
$ vim package.json
add the following
"devDependencies": {
"nodemon": "*"
}
change the scripts / start value:
"start": "nodemon app.js"
download dependency nodemon
$ npm install
start the server via nodemon
$ npm start
Wednesday, 2 October 2013
node.js / express.js / yeoman / angular installation on Fedora 19
download the prebuilt binary:
http://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar.gz
download and build from source
cd /tmp
wget http://nodejs.org/dist/v0.10.20/node-v0.10.20.tar.gz
tar -xf node-v0.10.20-linux-x64.tar.gz
cd node-v0.10.20-linux-x64/
configure, build and install
export PREFIX=/usr/local # or whatever your prefix is
./configure --prefix=$PREFIX
export LINK=g++ # only required if you're building on NFS
make
make install
clean up temporary files
rm -rf /tmp/node-v0.10.20-linux-x64*
add node to your path
export PATH=$PREFIX/bin:$PATH
display node and npm versions
node --version
v0.10.20
npm --version
1.3.11
install express.js
npm install -g express
display express version
express --version
3.4.0
install yeoman
npm install -g yo
install yeoman angular generator
npm install -g generator-angular
create angular app
yo angular app-name
serve angular app
grunt server
http://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar.gz
download and build from source
cd /tmp
wget http://nodejs.org/dist/v0.10.20/node-v0.10.20.tar.gz
tar -xf node-v0.10.20-linux-x64.tar.gz
cd node-v0.10.20-linux-x64/
configure, build and install
export PREFIX=/usr/local # or whatever your prefix is
./configure --prefix=$PREFIX
export LINK=g++ # only required if you're building on NFS
make
make install
clean up temporary files
rm -rf /tmp/node-v0.10.20-linux-x64*
add node to your path
export PATH=$PREFIX/bin:$PATH
display node and npm versions
node --version
v0.10.20
npm --version
1.3.11
install express.js
npm install -g express
display express version
express --version
3.4.0
install yeoman
npm install -g yo
install yeoman angular generator
npm install -g generator-angular
create angular app
yo angular app-name
serve angular app
grunt server
Subscribe to:
Posts (Atom)